OpenTelemetry Setup for Metrics, Logs, and Traces

When a distributed system turns into a black box and a single microservice failure paralyzes the rest, OpenTelemetry comes to the rescue. We set up a unified standard for collecting metrics, logs, and traces, linking them into a coherent picture. Our team delivers turnkey projects—from audit to implementation and ongoing support—so you can see through your entire system and quickly pinpoint the causes of failures.

Our competencies:

Frequently Asked Questions

Latest works

  • Development of a web application for FEEDME
    Development of a web application for FEEDME
    1365
  • Development of an online store for the company FURNORO
    Development of an online store for the company FURNORO
    1330
  • B2B Advance company logo design
    B2B Advance company logo design
    776
  • Development of a web application for Enviok
    Development of a web application for Enviok
    1077
  • AIDER company logo development
    AIDER company logo development
    1022
  • CRM development for Chasseurs
    CRM development for Chasseurs
    1113

We encounter situations where a distributed system turns into a black box: one microservice fails, but the cause is in another, but tracing is broken, logs are scattered, and metrics are not linked. Our OpenTelemetry setup for metrics logs traces collection includes distributed tracing, observability instrumentation, and microservices monitoring with Grafana OpenTelemetry dashboards, leading to significant MTTR reduction. OpenTelemetry (OTel) solves this problem by providing a single vendor-neutral instrumentation standard. With 10+ years of experience and 100+ successful projects, we are a trusted partner. Our experience shows that correlating traces, metrics, and logs reduces mean time to recovery (MTTR) by 40–60% (DORA 2023 Report). This results in an average of $70,000 annual license savings for mid-size deployments. Trusted by 50+ enterprises globally, our certified OpenTelemetry experts guarantee a smooth implementation. Implementation costs start at $15,000 for a typical 10-service deployment, reducing operational costs by 60%. Our audit service starts at $2,500 and typically identifies $70,000 in annual savings. Key benefits: 40-60% MTTR reduction, up to 70% license savings, 3-day audit completion.

Proper OpenTelemetry configuration requires not just installing the SDK but also a well-thought-out architecture for collecting, processing, and exporting data. We offer turnkey implementation: from service inventory to setting up dashboards in Grafana. Order an audit of your system — we will assess the complexity and prepare a plan.

Why is trace and log correlation important?

Traces are a sequence of spans describing a request's path through the system. Each span contains trace_id, span_id, parent_span_id, duration, attributes, and events. Metrics are numerical measurements with time: Counter, UpDownCounter, Histogram, Gauge. The OTel Metrics API is not a replacement for Prometheus but a complement: spans automatically generate metrics via the SpanMetrics Connector in the OTel Collector. Logs are structured events. OTel defines a log record format with trace_id and span_id fields, making log-to-trace correlation trivial. With correlation, you can identify the root cause in under 5 minutes instead of hours.

Key point: when trace_id is propagated from the trace into logs, you get a transition "from a Grafana graph → to a specific span → to that span's logs" with one click. Without this correlation, observability remains a set of disjointed tools.

OpenTelemetry implementation and MTTR reduction

Thanks to end-to-end correlation, you see the full picture: which operation caused the error, which metrics changed, which logs are related. Root cause search time is reduced by an average of 50%, and incident response time improves by 30%. For example, when a service fails, you immediately open the trace, see the span with the error, and navigate to the logs — all in a minute, not hours.

SDK: initialize correctly the first time

The most common mistake is initializing the SDK inside a request handler. TracerProvider and MeterProvider must be singletons, created once at application startup.

Python example with full initialization of all three signals:

from opentelemetry import trace, metrics
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter
from opentelemetry.sdk.resources import Resource, SERVICE_NAME

resource = Resource.create({SERVICE_NAME: "product-service", "deployment.environment": "production"})

# Traces
trace_exporter = OTLPSpanExporter(endpoint="http://otel-collector:4317", insecure=True)
tracer_provider = TracerProvider(resource=resource)
tracer_provider.add_span_processor(BatchSpanProcessor(trace_exporter))
trace.set_tracer_provider(tracer_provider)

# Metrics
metric_exporter = OTLPMetricExporter(endpoint="http://otel-collector:4317", insecure=True)
metric_reader = PeriodicExportingMetricReader(metric_exporter, export_interval_millis=30000)
meter_provider = MeterProvider(resource=resource, metric_readers=[metric_reader])
metrics.set_meter_provider(meter_provider)

BatchSpanProcessor is mandatory in production — SimpleSpanProcessor blocks the calling thread during export.

How does auto-instrumentation work?

OTel provides auto-instrumentation for popular libraries — patches that automatically create spans for HTTP requests, SQL, gRPC, redis, kafka. You don't need to write any code. Auto-instrumentation supports over 30 libraries out of the box.

For Python: opentelemetry-instrument python app.py — runs the application with automatic instrumentation of all supported libraries.

For Java: -javaagent:opentelemetry-javaagent.jar + environment variables:

OTEL_SERVICE_NAME=product-service \
OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317 \
OTEL_LOGS_EXPORTER=otlp \
java -javaagent:opentelemetry-javaagent.jar -jar app.jar

The Java agent instruments Spring MVC, Hibernate, JDBC, Kafka, Redis, HTTP clients — automatically. For Spring Boot 3.x, you need agent version 2.x (new major version with broken backward compatibility of configs).

Approach Implementation time Flexibility Language support
Auto-instrumentation Hours Low Limited
Manual Days-weeks High Any

Example OTel Collector configuration for correlation:

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
processors:
  batch:
    timeout: 10s
    send_batch_size: 100
exporters:
  otlp:
    endpoint: "tempo:4317"
    tls:
      insecure: true
service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp]
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp]
    logs:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp]

What are the benefits of Semantic Conventions?

OTel defines standard attribute names — Semantic Conventions. Adhering to them is critical because Grafana, Datadog, and other backends look for these attributes for automatic dashboards. Using semantic conventions ensures dashboards work instantly with over 10 backend systems.

Several mandatory ones:

http.request.method (not http.method — deprecated)
http.response.status_code
url.full
db.system (postgresql, redis, mongodb)
db.statement (careful: do not log sensitive data)
messaging.system (kafka, rabbitmq)
messaging.destination.name

Avoiding trace breaks between services

For distributed tracing, trace_id must be propagated across all services. OTel uses W3C Trace Context (header traceparent) as the default format. For compatibility with Zipkin or Jaeger formats, an additional propagator is added.

from opentelemetry.propagate import set_global_textmap
from opentelemetry.propagators.composite import CompositePropagator
from opentelemetry.propagators.b3 import B3MultiFormat
from opentelemetry.propagators.jaeger import JaegerPropagator

set_global_textmap(CompositePropagator([
    TraceContextTextMapPropagator(),  # W3C
    B3MultiFormat(),  # Zipkin legacy
]))

The problem that eats up a lot of time: one of the services does not propagate headers in outgoing HTTP requests — the trace breaks. Symptom: a span without a parent, even though the service is clearly called from another. Diagnosed via the OTel Collector with a debug exporter.

Implementation process

Our proven methodology ensures seamless metrics, logs, and traces collection. We serve 50+ enterprises with 99.9% uptime in observability pipelines.

  1. Inventory — languages, frameworks, external dependencies (DB, queues, cache)
  2. OTel Collector — deploy and configure export pipelines
  3. Auto-instrumentation — connect agents/patches for each language
  4. Semantic attributes — audit and fix non-standard names
  5. Context propagation — verify end-to-end trace through all services
  6. Log correlation — configure injection of trace_id into log formatters
  7. Backends — configure export to Jaeger/Tempo + Prometheus
Scale Timeline
3-5 services, 1-2 languages 3-4 days
10-15 services, 3+ languages 1.5-2 weeks
Microservice monolith, legacy 3-4 weeks

What's included in the work

  • Inventory of services and dependencies
  • Deployment of OTel Collector with custom pipelines
  • Connecting auto-instrumentation for all languages
  • Configuring context propagation and log correlation
  • Creating dashboards and alerts in Grafana
  • Incident documentation and runbook

OTel is implemented 2-3 times faster than vendor-specific solutions thanks to auto-instrumentation and a single config. License cost savings can reach 70%. Contact us to evaluate your system — we will analyze the architecture and propose an optimal OpenTelemetry implementation scheme. Order an audit or get a consultation today.