Skip to content

Commit

Permalink
Add JMXFetch telemetry around bean/attribute matching (#487)
Browse files Browse the repository at this point in the history
* add bean attribute instance stats

* rename fields

* remove throw for MalformedObjectNameException

* remove throw for MalformedObjectNameException pt2

* fix status

* fix status pt2

* remove domains queried
  • Loading branch information
rayz authored Nov 10, 2023
1 parent 571c44f commit 33e7e94
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 11 deletions.
47 changes: 36 additions & 11 deletions src/main/java/org/datadog/jmxfetch/Instance.java
Original file line number Diff line number Diff line change
Expand Up @@ -509,13 +509,18 @@ public List<Metric> getMetrics() throws IOException {
}
}
}
instanceTelemetryBean.setBeansFetched(beans.size());
instanceTelemetryBean.setTopLevelAttributeCount(matchingAttributes.size());
instanceTelemetryBean.setMetricCount(metrics.size());
log.debug("Updated jmx bean for instance: " + this.getCheckName()
+ " With beans fetched = " + instanceTelemetryBean.getBeansFetched()
+ " top attributes = " + instanceTelemetryBean.getTopLevelAttributeCount()
+ " metrics = " + instanceTelemetryBean.getMetricCount());
if (instanceTelemetryBean != null) {
instanceTelemetryBean.setBeansFetched(beans.size());
instanceTelemetryBean.setTopLevelAttributeCount(matchingAttributes.size());
instanceTelemetryBean.setMetricCount(metrics.size());
log.debug("Updated jmx bean for instance: " + this.getCheckName()
+ " With beans fetched = " + instanceTelemetryBean.getBeansFetched()
+ " top attributes = " + instanceTelemetryBean.getTopLevelAttributeCount()
+ " metrics = " + instanceTelemetryBean.getMetricCount()
+ " wildcard domain query count = "
+ instanceTelemetryBean.getWildcardDomainQueryCount()
+ " bean match ratio = " + instanceTelemetryBean.getBeanMatchRatio());
}
return metrics;
}

Expand Down Expand Up @@ -547,11 +552,14 @@ private void getMatchingAttributes() throws IOException {
this.failingAttributes.clear();
int metricsCount = 0;

int beansWithAttributeMatch = 0;

if (!action.equals(AppConfig.ACTION_COLLECT)) {
reporter.displayInstanceName(this);
}

for (ObjectName beanName : this.beans) {
boolean attributeMatched = false;
if (limitReached) {
log.debug("Limit reached");
if (action.equals(AppConfig.ACTION_COLLECT)) {
Expand Down Expand Up @@ -702,7 +710,17 @@ private void getMatchingAttributes() throws IOException {
|| action.equals(AppConfig.ACTION_LIST_NOT_MATCHING))) {
reporter.displayNonMatchingAttributeName(jmxAttribute);
}
if (jmxAttribute.getMatchingConf() != null) {
attributeMatched = true;
}
}
if (attributeMatched) {
beansWithAttributeMatch += 1;
}
}
if (instanceTelemetryBean != null) {
instanceTelemetryBean.setBeanMatchRatio((double)
beansWithAttributeMatch / beans.size());
}
log.info("Found {} matching attributes", matchingAttributes.size());
}
Expand Down Expand Up @@ -733,14 +751,21 @@ private void refreshBeansList() throws IOException {
ObjectName name = new ObjectName(scope);
this.beans.addAll(connection.queryNames(name));
}
} catch (Exception e) {
} catch (MalformedObjectNameException e) {
log.error("Unable to create ObjectName", e);
} catch (IOException e) {
log.error(
"Unable to compute a common bean scope, querying all beans as a fallback",
e);
"Unable to query mbean server", e);
}
}

this.beans = (this.beans.isEmpty()) ? connection.queryNames(null) : this.beans;
if (this.beans.isEmpty()) {
this.beans = connection.queryNames(null);
if (instanceTelemetryBean != null) {
int wildcardQueryCount = instanceTelemetryBean.getWildcardDomainQueryCount();
instanceTelemetryBean.setWildcardDomainQueryCount(wildcardQueryCount + 1);
}
}
this.lastRefreshTime = System.currentTimeMillis();
}

Expand Down
4 changes: 4 additions & 0 deletions src/main/java/org/datadog/jmxfetch/Status.java
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,10 @@ private void addStats(
instStats.put("instance_attribute_count",
instanceTelemetryBean.getTopLevelAttributeCount());
instStats.put("instance_metric_count", instanceTelemetryBean.getMetricCount());
instStats.put("instance_wildcard_domain_query_count",
instanceTelemetryBean.getWildcardDomainQueryCount());
instStats.put("instance_bean_match_ratio",
instanceTelemetryBean.getBeanMatchRatio());
}
instStats.put("message", message);
instStats.put("status", status);
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/org/datadog/jmxfetch/util/InstanceTelemetry.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,16 @@ public class InstanceTelemetry implements InstanceTelemetryMBean {
private int beansFetched;
private int topLevelAttributeCount;
private int metricCount;
private int wildcardDomainQueryCount;
private double beanMatchRatio;

/** Jmxfetch telemetry bean constructor. */
public InstanceTelemetry() {
beansFetched = 0;
topLevelAttributeCount = 0;
metricCount = 0;
wildcardDomainQueryCount = 0;
beanMatchRatio = 0.0;
}

public int getBeansFetched() {
Expand All @@ -27,6 +31,13 @@ public int getMetricCount() {
return metricCount;
}

public int getWildcardDomainQueryCount() {
return wildcardDomainQueryCount;
}

public double getBeanMatchRatio() {
return beanMatchRatio;
}

public void setBeansFetched(int count) {
beansFetched = count;
Expand All @@ -40,5 +51,12 @@ public void setMetricCount(int count) {
metricCount = count;
}

public void setWildcardDomainQueryCount(int count) {
wildcardDomainQueryCount = count;
}

public void setBeanMatchRatio(double ratio) {
beanMatchRatio = ratio;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,8 @@ public interface InstanceTelemetryMBean {

int getMetricCount();

int getWildcardDomainQueryCount();

double getBeanMatchRatio();

}
6 changes: 6 additions & 0 deletions src/test/java/org/datadog/jmxfetch/StatusTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,14 @@ public void TestStatus() throws IOException {
int fakeBeansFetched = 11;
int fakeMetricCount = 29;
int fakeAttributeCount = 55;
int fakeWildcardDomainQueryCount = 9;
double fakeBeanMatchRatio = .4;

instance.setBeansFetched(fakeBeansFetched);
instance.setMetricCount(fakeMetricCount);
instance.setTopLevelAttributeCount(fakeAttributeCount);
instance.setWildcardDomainQueryCount(fakeWildcardDomainQueryCount);
instance.setBeanMatchRatio(fakeBeanMatchRatio);

status.addInstanceStats("fake_check", "fake_instance", 10, 3, "fake_message", Status.STATUS_OK, instance);
status.flush();
Expand All @@ -55,6 +59,8 @@ public void TestStatus() throws IOException {
assertEquals(fakeBeansFetched, stats.get("instance_bean_count"));
assertEquals(fakeAttributeCount, stats.get("instance_attribute_count"));
assertEquals(fakeMetricCount, stats.get("instance_metric_count"));
assertEquals(fakeWildcardDomainQueryCount, stats.get("instance_wildcard_domain_query_count"));
assertEquals(fakeBeanMatchRatio, stats.get("instance_bean_match_ratio"));
assertEquals("fake_message", stats.get("message"));
assertEquals(Status.STATUS_OK, stats.get("status"));
}
Expand Down

0 comments on commit 33e7e94

Please sign in to comment.