gapic-generator-java icon indicating copy to clipboard operation
gapic-generator-java copied to clipboard

feat: Allow Adding Client Level Attributes to MetricsTracerFactory

Open lqiu96 opened this issue 1 year ago • 2 comments

Allow the MetricsTracerFactory to take in a second parameter (Map of attributes) that will be treated as client level attributes. These attributes will be added to every single MetricsTracer created throughout the lifecycle of the client.

Was able to verify this behavior inside Cloud Monitoring: image

Additional Attribute was recorded.

Via:

    InstantiatingGrpcChannelProvider channelProvider =
            InstantiatingGrpcChannelProvider.newBuilder().build();

    Map<String, String> clientAttributesMapping = new HashMap<>();
    clientAttributesMapping.put("directpath_enabled", String.valueOf(channelProvider.canUseDirectPath()));

    ...
    options
      .setApiTracerFactory(new MetricsTracerFactory(recorder, clientAttributesMapping))
      .build();

lqiu96 avatar Mar 29 '24 14:03 lqiu96

Quality Gate Failed Quality Gate failed for 'gapic-generator-java-root'

Failed conditions
69.4% Coverage on New Code (required ≥ 80%)

See analysis details on SonarCloud

sonarqubecloud[bot] avatar Apr 23 '24 16:04 sonarqubecloud[bot]

Quality Gate Failed Quality Gate failed for 'java_showcase_integration_tests'

Failed conditions
55.3% Coverage on New Code (required ≥ 80%)

See analysis details on SonarCloud

sonarqubecloud[bot] avatar Apr 23 '24 16:04 sonarqubecloud[bot]

Error:

Error:  Failures: 
Error:    OpencensusTracerFactoryTest.testImplicitParentSpan:102 
Wanted but not invoked:
internalTracer.spanBuilderWithExplicitParent(
    <any string>,
    same(Mock for Span, hashCode: 125992315)
);
-> at com.google.api.gax.tracing.OpencensusTracerFactoryTest.testImplicitParentSpan(OpencensusTracerFactoryTest.java:102)

However, there were exactly 2 interactions with this mock:
internalTracer.getCurrentSpan();
-> at com.google.api.gax.tracing.OpencensusTracerFactory.newTracer(OpencensusTracerFactory.java:101)

internalTracer.spanBuilderWithExplicitParent(
    "FakeClient.FakeMethod",
    null
);
-> at com.google.api.gax.tracing.OpencensusTracerFactory.newTracer(OpencensusTracerFactory.java:110)


Error:    OpencensusTracerTest.testLongRunningExample:152 
Argument(s) are different! Wanted:
span.addAnnotation(
    "Operation started",
    {}
);
-> at com.google.api.gax.tracing.OpencensusTracerTest.testLongRunningExample(OpencensusTracerTest.java:152)
Actual invocations have different arguments:
span.addAnnotation(
    "Scheduling next poll",
    {"delay ms" = AttributeValueLong{longValue=5}, "attempt" = AttributeValueLong{longValue=0}, "status" = AttributeValueString{stringValue=OK}}
);
-> at com.google.api.gax.tracing.OpencensusTracer.attemptFailed(OpencensusTracer.java:353)
span.addAnnotation(
    "Operation started"
);
-> at com.google.api.gax.tracing.OpencensusTracer.lroStartSucceeded(OpencensusTracer.java:290)
span.addAnnotation(
    "Polling completed",
    {"attempt" = AttributeValueLong{longValue=1}}
);
-> at com.google.api.gax.tracing.OpencensusTracer.attemptSucceeded(OpencensusTracer.java:323)
span.putAttributes(
    {"attempt count" = AttributeValueLong{longValue=2}}
);
-> at com.google.api.gax.tracing.OpencensusTracer.operationSucceeded(OpencensusTracer.java:254)
span.end(
    
);
-> at com.google.api.gax.tracing.OpencensusTracer.operationSucceeded(OpencensusTracer.java:255)

[INFO] 
Error:  Tests run: 614, Failures: 2, Errors: 0, Skipped: 0

It seems I have somehow broke OpenCensus with this change.

lqiu96 avatar May 22 '24 19:05 lqiu96

Error:

Error:  Failures: 
Error:    OpencensusTracerFactoryTest.testImplicitParentSpan:102 
Wanted but not invoked:
internalTracer.spanBuilderWithExplicitParent(
    <any string>,
    same(Mock for Span, hashCode: 125992315)
);
-> at com.google.api.gax.tracing.OpencensusTracerFactoryTest.testImplicitParentSpan(OpencensusTracerFactoryTest.java:102)

However, there were exactly 2 interactions with this mock:
internalTracer.getCurrentSpan();
-> at com.google.api.gax.tracing.OpencensusTracerFactory.newTracer(OpencensusTracerFactory.java:101)

internalTracer.spanBuilderWithExplicitParent(
    "FakeClient.FakeMethod",
    null
);
-> at com.google.api.gax.tracing.OpencensusTracerFactory.newTracer(OpencensusTracerFactory.java:110)


Error:    OpencensusTracerTest.testLongRunningExample:152 
Argument(s) are different! Wanted:
span.addAnnotation(
    "Operation started",
    {}
);
-> at com.google.api.gax.tracing.OpencensusTracerTest.testLongRunningExample(OpencensusTracerTest.java:152)
Actual invocations have different arguments:
span.addAnnotation(
    "Scheduling next poll",
    {"delay ms" = AttributeValueLong{longValue=5}, "attempt" = AttributeValueLong{longValue=0}, "status" = AttributeValueString{stringValue=OK}}
);
-> at com.google.api.gax.tracing.OpencensusTracer.attemptFailed(OpencensusTracer.java:353)
span.addAnnotation(
    "Operation started"
);
-> at com.google.api.gax.tracing.OpencensusTracer.lroStartSucceeded(OpencensusTracer.java:290)
span.addAnnotation(
    "Polling completed",
    {"attempt" = AttributeValueLong{longValue=1}}
);
-> at com.google.api.gax.tracing.OpencensusTracer.attemptSucceeded(OpencensusTracer.java:323)
span.putAttributes(
    {"attempt count" = AttributeValueLong{longValue=2}}
);
-> at com.google.api.gax.tracing.OpencensusTracer.operationSucceeded(OpencensusTracer.java:254)
span.end(
    
);
-> at com.google.api.gax.tracing.OpencensusTracer.operationSucceeded(OpencensusTracer.java:255)

[INFO] 
Error:  Tests run: 614, Failures: 2, Errors: 0, Skipped: 0

It seems I have somehow broke OpenCensus with this change.

This seems to due to the added mockito-inline dependency used to mock static methods. I'm not sure why it's causing issues in non-related unit tests, so I'm going to remove this and look for a different way to test.

lqiu96 avatar May 23 '24 20:05 lqiu96

Based on https://github.com/googleapis/sdk-platform-java/issues/2818, I'll need to remove junit-pioneer and add mocks for EnvProvider.

lqiu96 avatar May 24 '24 20:05 lqiu96

Quality Gate Failed Quality Gate failed for 'gapic-generator-java-root'

Failed conditions
75.0% Coverage on New Code (required ≥ 80%)

See analysis details on SonarCloud

sonarqubecloud[bot] avatar May 24 '24 20:05 sonarqubecloud[bot]

Quality Gate Failed Quality Gate failed for 'java_showcase_integration_tests'

Failed conditions
36.4% Coverage on New Code (required ≥ 80%)

See analysis details on SonarCloud

sonarqubecloud[bot] avatar May 24 '24 20:05 sonarqubecloud[bot]

Quality Gate Failed Quality Gate failed for 'gapic-generator-java-root'

Failed conditions
71.8% Coverage on New Code (required ≥ 80%)

See analysis details on SonarCloud

sonarqubecloud[bot] avatar May 30 '24 20:05 sonarqubecloud[bot]

Quality Gate Failed Quality Gate failed for 'java_showcase_integration_tests'

Failed conditions
41.0% Coverage on New Code (required ≥ 80%)

See analysis details on SonarCloud

sonarqubecloud[bot] avatar May 30 '24 20:05 sonarqubecloud[bot]