Skip to content

Commit

Permalink
Live Metrics Filtering: Part 1 of 5 - port filtering functionality (#…
Browse files Browse the repository at this point in the history
…43040)

* swagger

* experimenting with ping api, not done yet

* experimental code, post not done, not tested

* initial draft and test changes

* changes to build point

* fix some bugs, fix some tests

* cleanup & test fixes

* minor changes I forgot to push

* a slight restructuring and adding yaml/licence headers

* Migrate changes to the new autoconfigure module (#42864)

* move

* markdown

* check

* delete unused files and remove version from yaml

* starting to port stuff, incomplete

* more code, not done

* updating some comments according to pr review

* starting to add test, test is failing

* PR comment

* trying to fix build error

* minor

* hopefully this should fix build analyze step errors

* added custom dim test, need to debug

* adding more tests

* final changes

* pr comment & fixing CI build errors

* pr comments

* code refactor; did not use TimeUnit as that led to some expected behavior

---------

Co-authored-by: Trask Stalnaker <trask.stalnaker@gmail.com>
  • Loading branch information
harsimar and trask authored Nov 26, 2024
1 parent 498b14a commit ceff155
Show file tree
Hide file tree
Showing 16 changed files with 1,059 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,17 @@
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.preaggregatedmetrics.ExtractorHelper.java" checks="MissingJavadocTypeCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.preaggregatedmetrics.RequestExtractor.java" checks="MissingJavadocTypeCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.QuickPulse.java" checks="MissingJavadocTypeCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.DependencyDataColumns.java" checks="MissingJavadocTypeCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.Filter.java" checks="MissingJavadocTypeCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.KnownDependencyColumns.java" checks="MissingJavadocTypeCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.KnownRequestColumns.java" checks="MissingJavadocTypeCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.RequestDataColumns.java" checks="MissingJavadocTypeCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.TelemetryColumns.java" checks="MissingJavadocTypeCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.TraceDataColumns.java" checks="MissingJavadocTypeCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.ExceptionDataColumns.java" checks="MissingJavadocTypeCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.CustomDimensions.java" checks="MissingJavadocTypeCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.KnownExceptionColumns.java" checks="MissingJavadocTypeCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.KnownTraceColumns.java" checks="MissingJavadocTypeCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.statsbeat.CustomDimensions.java" checks="MissingJavadocTypeCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.statsbeat.Feature.java" checks="MissingJavadocTypeCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.statsbeat.FeatureStatsbeat.java" checks="MissingJavadocTypeCheck" />
Expand Down Expand Up @@ -276,6 +287,7 @@
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.preaggregatedmetrics.RequestExtractor.java" checks="PackageNameCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.preaggregatedmetrics.package-info.java" checks="PackageNameCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.*" checks="PackageNameCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.*" checks="PackageNameCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.configuration.StatsbeatConnectionString.java" checks="RedundantModifierCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.QuickPulseDataFetcher.java" checks="RedundantModifierCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.statsbeat.RpAttachType.java" checks="RedundantModifierCheck" />
Expand Down Expand Up @@ -339,7 +351,15 @@
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.QuickPulseDataFetcher.java" checks="com.azure.tools.checkstyle.checks.UseCaughtExceptionCauseCheck" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.LiveMetricsRestAPIsForClientSDKs" checks="DenyListedWords" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.LiveMetricsRestAPIsForClientSDKs" checks="MissingJavadocMethod" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.ExceptionDataColumns" checks="MissingJavadocMethod" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.DependencyDataColumns" checks="MissingJavadocMethod" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.RequestDataColumns" checks="MissingJavadocMethod" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.TelemetryColumns" checks="MissingJavadocMethod" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.TraceDataColumns" checks="MissingJavadocMethod" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.Filter" checks="MissingJavadocMethod" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.CustomDimensions" checks="MissingJavadocMethod" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.LiveMetricsRestAPIsForClientSDKsBuilder" checks="DenyListedWords" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.LiveMetricsRestAPIsForClientSDKsBuilder" checks="ServiceClientBuilder" />
<suppress files="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.*" checks="JavadocPackage" />

</suppressions>
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
<Class name="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.DocumentStreamInfo" />
<Class name="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.FilterConjunctionGroupInfo" />
<Class name="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.MonitoringDataPoint" />
<Class name="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.CustomDimensions" />
</Or>
</Match>
<Match>
Expand Down Expand Up @@ -98,5 +99,9 @@
<Bug pattern="NM_CLASS_NOT_EXCEPTION" />
<Class name="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.Exception" />
</Match>
<Match>
<Bug pattern="DM_CONVERT_CASE" />
<Class name="com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering.Filter" />
</Match>

</FindBugsFilter>
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ private void addException(TelemetryExceptionData exceptionData, int itemCount) {
counters.exceptions.addAndGet(itemCount);

List<TelemetryExceptionDetails> exceptionList = exceptionData.getExceptions();
// Exception is a class from live metrics swagger that represents a document for an exception
Exception exceptionDoc = new Exception();
if (exceptionList != null && !exceptionList.isEmpty()) {
exceptionDoc.setExceptionMessage(exceptionList.get(0).getMessage());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering;

import java.util.HashMap;
import java.util.Map;

public class CustomDimensions {
private Map<String, String> customDimensions;

public CustomDimensions() {
this.customDimensions = new HashMap<String, String>();
}

public void setCustomDimensions(Map<String, String> customDimensions, Map<String, Double> customMeasurements) {
Map<String, String> resultMap = new HashMap<>();
if (customDimensions != null) {
resultMap.putAll(customDimensions);
}
if (customMeasurements != null) {
for (Map.Entry<String, Double> cmEntry : customMeasurements.entrySet()) {
resultMap.put(cmEntry.getKey(), cmEntry.getValue().toString());
}
}
this.customDimensions = resultMap;
}

public Map<String, String> getCustomDimensions() {
return this.customDimensions;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering;

import com.azure.monitor.opentelemetry.autoconfigure.implementation.models.RemoteDependencyData;
import com.azure.monitor.opentelemetry.autoconfigure.implementation.utils.FormattedDuration;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

// Casing of private fields is to match the names of fields passed down via filtering configuration
public class DependencyDataColumns implements TelemetryColumns {
private final CustomDimensions customDims;
private final Map<String, Object> mapping = new HashMap<>();

public DependencyDataColumns(RemoteDependencyData rdData) {
customDims = new CustomDimensions();
customDims.setCustomDimensions(rdData.getProperties(), rdData.getMeasurements());
mapping.put(KnownDependencyColumns.TARGET, rdData.getTarget());
mapping.put(KnownDependencyColumns.DURATION,
FormattedDuration.getDurationFromTelemetryItemDurationString(rdData.getDuration()));
mapping.put(KnownDependencyColumns.SUCCESS, rdData.isSuccess());
mapping.put(KnownDependencyColumns.NAME, rdData.getName());
int resultCode;
try {
resultCode = Integer.parseInt(rdData.getResultCode());
} catch (NumberFormatException e) {
resultCode = -1;
}
mapping.put(KnownDependencyColumns.RESULT_CODE, resultCode);
mapping.put(KnownDependencyColumns.TYPE, rdData.getType());
mapping.put(KnownDependencyColumns.DATA, rdData.getData());
}

// To be used for tests only
public DependencyDataColumns(String target, long duration, boolean success, String name, int resultCode,
String type, String data, Map<String, String> dims, Map<String, Double> measurements) {
customDims = new CustomDimensions();
customDims.setCustomDimensions(dims, measurements);
mapping.put(KnownDependencyColumns.TARGET, target);
mapping.put(KnownDependencyColumns.DURATION, duration);
mapping.put(KnownDependencyColumns.SUCCESS, success);
mapping.put(KnownDependencyColumns.NAME, name);
mapping.put(KnownDependencyColumns.RESULT_CODE, resultCode);
mapping.put(KnownDependencyColumns.TYPE, type);
mapping.put(KnownDependencyColumns.DATA, data);
}

public <T> T getFieldValue(String fieldName, Class<T> type) {
return type.cast(mapping.get(fieldName));
}

public Map<String, String> getCustomDimensions() {
return this.customDims.getCustomDimensions();
}

public List<String> getAllFieldValuesAsString() {
List<String> result = new ArrayList<>();
for (Object value : mapping.values()) {
if (value instanceof String) {
result.add((String) value);
} else if (value instanceof Integer) {
result.add(((Integer) value).toString());
} else if (value instanceof Long) {
result.add(((Long) value).toString());
} else { // boolean
result.add(((Boolean) value).toString());
}
}
return result;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.filtering;

import com.azure.monitor.opentelemetry.autoconfigure.implementation.models.TelemetryExceptionData;
import com.azure.monitor.opentelemetry.autoconfigure.implementation.models.TelemetryExceptionDetails;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

// Casing of private fields is to match the names of fields passed down via filtering configuration
public class ExceptionDataColumns implements TelemetryColumns {

private final CustomDimensions customDims;

private final Map<String, Object> mapping = new HashMap<>();

public ExceptionDataColumns(TelemetryExceptionData exceptionData) {
customDims = new CustomDimensions();
customDims.setCustomDimensions(exceptionData.getProperties(), exceptionData.getMeasurements());
List<TelemetryExceptionDetails> details = exceptionData.getExceptions();
mapping.put(KnownExceptionColumns.MESSAGE,
details != null && !details.isEmpty() ? details.get(0).getMessage() : "");
mapping.put(KnownExceptionColumns.STACK,
details != null && !details.isEmpty() ? details.get(0).getStack() : "");
}

// To be used in tests only
public ExceptionDataColumns(String message, String stackTrace, Map<String, String> dims,
Map<String, Double> measurements) {
customDims = new CustomDimensions();
customDims.setCustomDimensions(dims, measurements);
mapping.put(KnownExceptionColumns.MESSAGE, message);
mapping.put(KnownExceptionColumns.STACK, stackTrace);
}

public Map<String, String> getCustomDimensions() {
return this.customDims.getCustomDimensions();
}

public <T> T getFieldValue(String fieldName, Class<T> type) {
return type.cast(mapping.get(fieldName));
}

public List<String> getAllFieldValuesAsString() {
List<String> result = new ArrayList<>();
for (Object value : mapping.values()) {
result.add((String) value);
}
return result;
}
}
Loading

0 comments on commit ceff155

Please sign in to comment.