<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sonic Boom</title>
    <description>The latest articles on DEV Community by Sonic Boom (@sonicboom9090).</description>
    <link>https://dev.to/sonicboom9090</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2666971%2Fd832e3a8-b263-4fa7-8c02-ff11a64c8e89.png</url>
      <title>DEV Community: Sonic Boom</title>
      <link>https://dev.to/sonicboom9090</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sonicboom9090"/>
    <language>en</language>
    <item>
      <title>OpenTelemetry integration with Dynatrace</title>
      <dc:creator>Sonic Boom</dc:creator>
      <pubDate>Tue, 07 Jan 2025 01:52:14 +0000</pubDate>
      <link>https://dev.to/sonicboom9090/opentelemetry-3m4m</link>
      <guid>https://dev.to/sonicboom9090/opentelemetry-3m4m</guid>
      <description>&lt;h2&gt;
  
  
  Credit Decision Application Flow (Highest Priority)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Track complete decision flow from application submission to final decision&lt;/li&gt;
&lt;li&gt;Measure processing time at each decision checkpoint&lt;/li&gt;
&lt;li&gt;Monitor credit bureau API response times&lt;/li&gt;
&lt;li&gt;Track decision rules execution time&lt;/li&gt;
&lt;li&gt;Key metrics to collect:&lt;/li&gt;
&lt;li&gt;Time from submission to final decision&lt;/li&gt;
&lt;li&gt;Processing time per decision rule&lt;/li&gt;
&lt;li&gt;Number of applications in each state&lt;/li&gt;
&lt;li&gt;Failure rates at each checkpoint&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cross-Service Transaction Monitoring
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Since your services are synchronous, track the entire request chain&lt;/li&gt;
&lt;li&gt;Monitor service dependencies and their health&lt;/li&gt;
&lt;li&gt;Identify service communication bottlenecks&lt;/li&gt;
&lt;li&gt;Key areas to instrument:&lt;/li&gt;
&lt;li&gt;Inter-service REST calls&lt;/li&gt;
&lt;li&gt;Service response times&lt;/li&gt;
&lt;li&gt;Error rates between services&lt;/li&gt;
&lt;li&gt;Request payload sizes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  MongoDB Performance Optimization
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Track query patterns across all services&lt;/li&gt;
&lt;li&gt;Monitor document access patterns&lt;/li&gt;
&lt;li&gt;Key metrics to collect:&lt;/li&gt;
&lt;li&gt;Query execution times&lt;/li&gt;
&lt;li&gt;Frequently accessed collections&lt;/li&gt;
&lt;li&gt;Slow queries (&amp;gt; 100ms)&lt;/li&gt;
&lt;li&gt;Index usage statistics&lt;/li&gt;
&lt;li&gt;Connection pool utilization
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Span: CreditApplication
|- Attributes:
   |- application_id
   |- customer_id
   |- current_stage
   |- decision_outcome
|- Child Spans:
   |- DocumentValidation
   |- CreditCheck
   |- DecisionEngine
   |- CardIssuance

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;properties&amp;gt;
    &amp;lt;opentelemetry.version&amp;gt;1.32.0&amp;lt;/opentelemetry.version&amp;gt;
&amp;lt;/properties&amp;gt;

&amp;lt;dependencies&amp;gt;
    &amp;lt;!-- OpenTelemetry API --&amp;gt;
    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;io.opentelemetry&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;opentelemetry-api&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;${opentelemetry.version}&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;

    &amp;lt;!-- OpenTelemetry SDK --&amp;gt;
    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;io.opentelemetry&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;opentelemetry-sdk&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;${opentelemetry.version}&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;

    &amp;lt;!-- OpenTelemetry OTLP Exporter --&amp;gt;
    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;io.opentelemetry&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;opentelemetry-exporter-otlp&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;${opentelemetry.version}&amp;lt;/dependency&amp;gt;

    &amp;lt;!-- Spring Boot Starter --&amp;gt;
    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;spring-boot-starter-actuator&amp;lt;/artifactId&amp;gt;
    &amp;lt;/dependency&amp;gt;
&amp;lt;/dependencies&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Configuration
public class OpenTelemetryConfig {

    @Value("${dynatrace.endpoint}")
    private String dynatraceEndpoint;

    @Bean
    public OpenTelemetry openTelemetry() {
        Resource resource = Resource.getDefault()
            .merge(Resource.create(Attributes.of(
                ResourceAttributes.SERVICE_NAME, "credit-check-service",
                ResourceAttributes.SERVICE_VERSION, "1.0"
            )));

        SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
            .setResource(resource)
            .addSpanProcessor(BatchSpanProcessor.builder(
                OtlpGrpcSpanExporter.builder()
                    .setEndpoint(dynatraceEndpoint)
                    .build())
                .build())
            .build();

        return OpenTelemetrySdk.builder()
            .setTracerProvider(sdkTracerProvider)
            .buildAndRegisterGlobal();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Service
@Slf4j
public class CreditCheckService {

    private final Tracer tracer;
    private final CreditBureauClient creditBureauClient;

    public CreditCheckService(OpenTelemetry openTelemetry, CreditBureauClient creditBureauClient) {
        this.tracer = openTelemetry.getTracer("credit-check-service");
        this.creditBureauClient = creditBureauClient;
    }

    public CreditCheckResult performCreditCheck(String applicationId, String customerId) {
        Span span = tracer.spanBuilder("credit.check")
            .setAttribute("application.id", applicationId)
            .setAttribute("customer.id", customerId)
            .startSpan();

        try (Scope scope = span.makeCurrent()) {
            long startTime = System.currentTimeMillis();

            // Create child span for bureau call
            Span bureauCallSpan = tracer.spanBuilder("credit.bureau.call")
                .setAttribute("bureau.name", "ExampleBureau")
                .startSpan();

            CreditBureauResponse bureauResponse;
            try {
                bureauResponse = creditBureauClient.getCreditScore(customerId);
                bureauCallSpan.setAttribute("credit.score", bureauResponse.getCreditScore());
                bureauCallSpan.setStatus(StatusCode.OK);
            } catch (Exception e) {
                bureauCallSpan.setStatus(StatusCode.ERROR);
                bureauCallSpan.recordException(e);
                throw e;
            } finally {
                bureauCallSpan.end();
            }

            // Add important metrics to main span
            span.setAttribute("credit.score", bureauResponse.getCreditScore());
            span.setAttribute("processing.time_ms", System.currentTimeMillis() - startTime);
            span.setAttribute("check.status", "COMPLETED");

            return new CreditCheckResult(bureauResponse);
        } catch (Exception e) {
            span.setStatus(StatusCode.ERROR, e.getMessage());
            span.recordException(e);
            throw e;
        } finally {
            span.end();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dynatrace.endpoint=https://your-environment-id.live.dynatrace.com/api/v2/otlp/v1/traces
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parent Span (Application Process):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic Info: application.id, customer.id, product.type&lt;/li&gt;
&lt;li&gt;Application Details: application.type, channel, priority&lt;/li&gt;
&lt;li&gt;Customer Info: customer.segment&lt;/li&gt;
&lt;li&gt;Timing: timestamp.received, process.start.time, process.duration_ms&lt;/li&gt;
&lt;li&gt;Outcome: application.status, decision.outcome&lt;/li&gt;
&lt;li&gt;Error Tracking: error.occurred, error.reason, error.code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Child Span (Credit Check):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic Info: application.id, customer.id, check.type&lt;/li&gt;
&lt;li&gt;Bureau Info: bureau.name, bureau.request.id&lt;/li&gt;
&lt;li&gt;Timing: check.start.time, check.duration_ms&lt;/li&gt;
&lt;li&gt;Results: credit.score, credit.score.band&lt;/li&gt;
&lt;li&gt;Decision: decision.outcome, decision.factors.count&lt;/li&gt;
&lt;li&gt;Performance: check.duration_ms&lt;/li&gt;
&lt;li&gt;Additional Info: additional.checks.required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nested Child Span (Bureau Call):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Request Info: bureau.request.id, bureau.request.type&lt;/li&gt;
&lt;li&gt;Response: credit.score, bureau.response.status&lt;/li&gt;
&lt;li&gt;Performance: bureau.response.time_ms&lt;/li&gt;
&lt;li&gt;Error Handling: error.type, error.message&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These attributes provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete traceability of the application process&lt;/li&gt;
&lt;li&gt;Performance metrics at each stage&lt;/li&gt;
&lt;li&gt;Business metrics (credit scores, decisions)&lt;/li&gt;
&lt;li&gt;Error tracking and debugging information&lt;/li&gt;
&lt;li&gt;Operational metrics for monitoring and alerting&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
  </channel>
</rss>
