opentelemetry_propagator_gcp 0.0.1
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;
}