opentelemetry_propagator_gcp 0.0.1 copy "opentelemetry_propagator_gcp: ^0.0.1" to clipboard
opentelemetry_propagator_gcp: ^0.0.1 copied to clipboard

OpenTelemetry propagator for Google Cloud's X-Cloud-Trace-Context header, mirroring the official Python, Go and JavaScript packages.

example/opentelemetry_propagator_gcp_example.dart

// Accepting Google Cloud's X-Cloud-Trace-Context on the way in, while keeping
// outbound calls on W3C traceparent.
//
// Run with: dart run example/opentelemetry_propagator_gcp_example.dart

import 'package:dartastic_opentelemetry_api/dartastic_opentelemetry_api.dart';
import 'package:opentelemetry_propagator_gcp/opentelemetry_propagator_gcp.dart';

void main() {
  // What Cloud Run puts on an inbound request. The span id is decimal.
  final inboundHeaders = <String, String>{
    'x-cloud-trace-context': '4bf92f3577b34da6a3ce929d0e0e4736/1234567890;o=1',
  };

  // The read-only propagator: accept the platform's header, never emit it.
  const propagator = CloudTraceOneWayPropagator<Map<String, String>>();

  final context = propagator.extract(
    OTelAPI.context(),
    inboundHeaders,
    HeaderGetter(inboundHeaders),
  );

  final parent = context.spanContext!;
  print('trace id : ${parent.traceId.hexString}');
  print('span id  : ${parent.spanId.hexString}'); // 00000000499602d2, not 0000001234567890
  print('sampled  : ${parent.traceFlags.isSampled}');
  print('remote   : ${parent.isRemote}');

  // Nothing is written back: outbound calls should carry traceparent instead.
  final outboundHeaders = <String, String>{};
  propagator.inject(context, outboundHeaders, HeaderSetter(outboundHeaders));
  print('outbound : $outboundHeaders'); // {}
}

/// Reads headers case-insensitively, as HTTP requires.
class HeaderGetter implements TextMapGetter<String> {
  const HeaderGetter(this.headers);

  final Map<String, String> headers;

  @override
  String? get(String key) {
    final wanted = key.toLowerCase();
    for (final entry in headers.entries) {
      if (entry.key.toLowerCase() == wanted) return entry.value;
    }
    return null;
  }

  @override
  Iterable<String> keys() => headers.keys;
}

class HeaderSetter extends TextMapSetter<String> {
  HeaderSetter(this.headers);

  final Map<String, String> headers;

  @override
  void set(String key, String value) => headers[key] = value;
}
0
likes
160
points
94
downloads

Documentation

API reference

Publisher

verified publisherccisne.dev

Weekly Downloads

OpenTelemetry propagator for Google Cloud's X-Cloud-Trace-Context header, mirroring the official Python, Go and JavaScript packages.

Repository (GitHub)
View/report issues

Topics

#opentelemetry #tracing #observability #gcp

License

Apache-2.0 (license)

Dependencies

dartastic_opentelemetry_api

More

Packages that depend on opentelemetry_propagator_gcp