Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Version 2.0.0
- Porting to aws-cloudwatch-exts-commons 2.0.1.1
- config file extension changed from yaml to yml
270 changes: 154 additions & 116 deletions README.md

Large diffs are not rendered by default.

34 changes: 28 additions & 6 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.appdynamics.extensions</groupId>
<artifactId>aws-customnamespace-monitoring-extension</artifactId>
<version>1.0.2</version>
<version>2.0.0</version>
<name>AWS Custom Namespace Monitoring Extension</name>

<properties>
Expand All @@ -30,7 +30,7 @@
<dependency>
<groupId>com.appdynamics.extensions</groupId>
<artifactId>aws-cloudwatch-exts-commons</artifactId>
<version>1.0.6</version>
<version>2.0.1.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
Expand Down Expand Up @@ -60,8 +60,8 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
Expand Down Expand Up @@ -103,6 +103,7 @@
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Implementation-Title>AWS Custom Namespace Monitor v${project.version} Build Date ${maven.build.timestamp}</Implementation-Title>
<Main-Class>com.appdynamics.extensions.workbench.WorkbenchServerLauncher</Main-Class>
</manifestEntries>
</transformer>
</transformers>
Expand All @@ -123,8 +124,7 @@
<mkdir dir="${target.dir}" />
<copy todir="${target.dir}">
<fileset dir="src/main/resources/conf" includes="monitor.xml" />
<fileset dir="src/main/resources" includes="conf/config.yaml" />
<fileset dir="src/main/resources" includes="conf/region-endpoints.yaml" />
<fileset dir="src/main/resources/conf" includes="config.yml" />
<fileset dir="${project.basedir}" includes="LICENSE.txt"/>
<fileset dir="${project.basedir}" includes="NOTICE.txt"/>
</copy>
Expand Down Expand Up @@ -163,6 +163,28 @@
<tag>${project.artifactId}-${project.version}</tag>
</configuration>
</plugin>
<plugin>
<groupId>com.appdynamics.maven.plugin</groupId>
<artifactId>yaml-validate-maven-plugin</artifactId>
<version>1.0</version>

<configuration>
<yamlPath>src/main/resources/conf/config.yml</yamlPath>
<yamlPath>src/test/resources/conf/itest-encrypted-config.yml</yamlPath>
<yamlPath>src/test/resources/conf/itest-proxy-config.yml</yamlPath>
<yamlPath>src/test/resources/conf/test-dynamodb-config.yml</yamlPath>
<yamlPath>src/test/resources/conf/test-sqs-config.yml</yamlPath>
</configuration>

<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,22 @@
package com.appdynamics.extensions.aws.customnamespace;

import com.amazonaws.services.cloudwatch.AmazonCloudWatch;
import com.amazonaws.services.cloudwatch.model.Metric;
import com.appdynamics.extensions.aws.config.MetricType;
import com.amazonaws.services.cloudwatch.model.DimensionFilter;
import com.appdynamics.extensions.aws.config.Dimension;
import com.appdynamics.extensions.aws.config.IncludeMetric;
import com.appdynamics.extensions.aws.dto.AWSMetric;
import com.appdynamics.extensions.aws.metric.NamespaceMetricStatistics;
import com.appdynamics.extensions.aws.metric.StatisticType;
import com.appdynamics.extensions.aws.metric.processors.MetricsProcessor;
import com.appdynamics.extensions.aws.metric.processors.MetricsProcessorHelper;
import com.appdynamics.extensions.aws.predicate.MultiDimensionPredicate;
import com.appdynamics.extensions.metrics.Metric;
import com.google.common.collect.Lists;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.concurrent.atomic.LongAdder;

/**
* @author Florencio Sarmiento
Expand All @@ -28,31 +33,47 @@ public class CustomNamespaceMetricsProcessor implements MetricsProcessor {

private String namespace;

private List<MetricType> metricTypes;
private List<IncludeMetric> includeMetrics;
private List<Dimension> dimensions;

private Pattern excludeMetricsPattern;

public CustomNamespaceMetricsProcessor(List<MetricType> metricTypes,
Set<String> excludeMetrics,
public CustomNamespaceMetricsProcessor(List<IncludeMetric> includeMetrics, List<Dimension> dimensions,
String namespace) {
this.metricTypes = metricTypes;
this.excludeMetricsPattern = MetricsProcessorHelper.createPattern(excludeMetrics);
this.includeMetrics = includeMetrics;
this.dimensions = dimensions;
this.namespace = namespace;
}

public List<Metric> getMetrics(AmazonCloudWatch awsCloudWatch, String accountName) {
return MetricsProcessorHelper.getFilteredMetrics(awsCloudWatch,
namespace,
excludeMetricsPattern);
@Override
public List<AWSMetric> getMetrics(AmazonCloudWatch amazonCloudWatch, String s, LongAdder awsRequestsCounter) {
List<DimensionFilter> dimensionFilters = getDimensionFilters();
MultiDimensionPredicate predicate = new MultiDimensionPredicate(dimensions);
return MetricsProcessorHelper.getFilteredMetrics(amazonCloudWatch, awsRequestsCounter,
namespace, includeMetrics, dimensionFilters, predicate);
}

private List<DimensionFilter> getDimensionFilters() {
List<DimensionFilter> dimensionFilters = Lists.newArrayList();
for (Dimension dimension : dimensions) {
DimensionFilter dbDimensionFilter = new DimensionFilter();
dbDimensionFilter.withName(dimension.getName());
dimensionFilters.add(dbDimensionFilter);
}
return dimensionFilters;
}

public StatisticType getStatisticType(Metric metric) {
return MetricsProcessorHelper.getStatisticType(metric, metricTypes);
@Override
public StatisticType getStatisticType(AWSMetric awsMetric) {
return MetricsProcessorHelper.getStatisticType(awsMetric.getIncludeMetric(), includeMetrics);
}

public Map<String, Double> createMetricStatsMapForUpload(NamespaceMetricStatistics namespaceMetricStats) {
public List<Metric> createMetricStatsMapForUpload(NamespaceMetricStatistics namespaceMetricStats) {
Map<String, String> dimensionToMetricPathNameDictionary = new HashMap<String, String>();
for (Dimension dimension : dimensions) {
dimensionToMetricPathNameDictionary.put(dimension.getName(), dimension.getDisplayName());
}

return MetricsProcessorHelper.createMetricStatsMapForUpload(namespaceMetricStats,
null, true);
dimensionToMetricPathNameDictionary, true);
}

public String getNamespace() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,85 +8,62 @@

package com.appdynamics.extensions.aws.customnamespace;

import static com.appdynamics.extensions.aws.Constants.METRIC_PATH_SEPARATOR;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.log4j.Logger;

import com.appdynamics.extensions.aws.MultipleNamespaceCloudwatchMonitor;
import com.appdynamics.extensions.aws.SingleNamespaceCloudwatchMonitor;
import com.appdynamics.extensions.aws.collectors.NamespaceMetricStatisticsCollector;
import com.appdynamics.extensions.aws.config.ConcurrencyConfig;
import com.appdynamics.extensions.aws.customnamespace.conf.CustomNamespaceAccount;
import com.appdynamics.extensions.aws.customnamespace.conf.CustomNamespaceConfiguration;
import com.appdynamics.extensions.aws.metric.processors.MetricsProcessor;
import org.apache.log4j.Logger;

import static com.appdynamics.extensions.aws.Constants.METRIC_PATH_SEPARATOR;

/**
* @author Florencio Sarmiento
*
*/
public class CustomNamespaceMonitor extends MultipleNamespaceCloudwatchMonitor<CustomNamespaceConfiguration> {
private static final Logger LOGGER = Logger.getLogger("com.singularity.extensions.aws.CustomNamespaceMonitor");
private static final String DEFAULT_METRIC_PREFIX = String.format("%s%s%s%s",
"Custom Metrics", METRIC_PATH_SEPARATOR, "Amazon Custom Namespace", METRIC_PATH_SEPARATOR);
public class CustomNamespaceMonitor extends SingleNamespaceCloudwatchMonitor<CustomNamespaceConfiguration> {

private static final Logger LOGGER = Logger.getLogger(CustomNamespaceMonitor.class);

private static final String DEFAULT_METRIC_PREFIX = String.format("%s%s%s%s",
"Custom Metrics", METRIC_PATH_SEPARATOR, "Amazon Custom Namespace", METRIC_PATH_SEPARATOR);

public CustomNamespaceMonitor() {
super(CustomNamespaceConfiguration.class);
LOGGER.info(String.format("Using AWS Custom Namespace Monitor Version [%s]",
this.getClass().getPackage().getImplementationTitle()));
}
public CustomNamespaceMonitor() {
super(CustomNamespaceConfiguration.class);
}

@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
protected List<NamespaceMetricStatisticsCollector> getNamespaceMetricStatisticsCollectorList(
CustomNamespaceConfiguration config) {

List<NamespaceMetricStatisticsCollector> collectors = new ArrayList<NamespaceMetricStatisticsCollector>();

for (CustomNamespaceAccount account : config.getAccounts()) {
for (String namespace : account.getNamespaces()) {
MetricsProcessor metricsProcessor =
new CustomNamespaceMetricsProcessor(config.getMetricsConfig().getMetricTypes(),
config.getMetricsConfig().getExcludeMetrics(),
namespace);
@Override
protected String getDefaultMetricPrefix() {
return DEFAULT_METRIC_PREFIX;
}

NamespaceMetricStatisticsCollector collector = new NamespaceMetricStatisticsCollector
.Builder((List) Arrays.asList(account),
(ConcurrencyConfig) config.getConcurrencyConfig(),
config.getMetricsConfig(),
metricsProcessor)
.withCredentialsEncryptionConfig(config.getCredentialsDecryptionConfig())
.withProxyConfig(config.getProxyConfig())
.build();

collectors.add(collector);
}
}

if (collectors.isEmpty()) {
LOGGER.warn("No namespace is configured for monitoring");
}

return collectors;
}
@Override
public String getMonitorName() {
return "AWSCustomNamespaceMonitor";
}

@Override
protected int getNoOfNamespaceThreads(CustomNamespaceConfiguration config) {
return config.getConcurrencyConfig().getNoOfNamespaceThreads();
}
@Override
protected int getTaskCount() {
return 3;
}

@Override
protected String getMetricPrefix(CustomNamespaceConfiguration config) {
return DEFAULT_METRIC_PREFIX;
}
@Override
protected Logger getLogger() {
return LOGGER;
}

@Override
protected Logger getLogger() {
return LOGGER;
}
@Override
protected NamespaceMetricStatisticsCollector getNamespaceMetricsCollector(CustomNamespaceConfiguration config) {
MetricsProcessor metricsProcessor =
new CustomNamespaceMetricsProcessor(config.getMetricsConfig().getIncludeMetrics(),
config.getDimensions(),
config.getNamespace());

return new NamespaceMetricStatisticsCollector
.Builder(config.getAccounts(),
config.getConcurrencyConfig(),
config.getMetricsConfig(),
metricsProcessor, config.getMetricPrefix())
.withCredentialsDecryptionConfig(config.getCredentialsDecryptionConfig())
.withProxyConfig(config.getProxyConfig())
.build();
}
}

This file was deleted.

This file was deleted.

Loading