Exemplo n.º 1
0
    def _translate_data(
        self, data: Sequence[SDKSpan]
    ) -> ExportTraceServiceRequest:
        # pylint: disable=attribute-defined-outside-init

        sdk_resource_instrumentation_library_spans = {}

        for sdk_span in data:

            if sdk_span.resource not in (
                sdk_resource_instrumentation_library_spans.keys()
            ):
                if sdk_span.instrumentation_info is not None:
                    instrumentation_library_spans = InstrumentationLibrarySpans(
                        instrumentation_library=InstrumentationLibrary(
                            name=sdk_span.instrumentation_info.name,
                            version=sdk_span.instrumentation_info.version,
                        )
                    )

                else:
                    instrumentation_library_spans = (
                        InstrumentationLibrarySpans()
                    )

                sdk_resource_instrumentation_library_spans[
                    sdk_span.resource
                ] = instrumentation_library_spans

            self._collector_span_kwargs = {}

            self._translate_name(sdk_span)
            self._translate_start_time(sdk_span)
            self._translate_end_time(sdk_span)
            self._translate_span_id(sdk_span)
            self._translate_trace_id(sdk_span)
            self._translate_parent(sdk_span)
            self._translate_context_trace_state(sdk_span)
            self._translate_attributes(sdk_span)
            self._translate_events(sdk_span)
            self._translate_links(sdk_span)
            self._translate_status(sdk_span)

            self._collector_span_kwargs["kind"] = getattr(
                CollectorSpan.SpanKind,
                "SPAN_KIND_{}".format(sdk_span.kind.name),
            )

            sdk_resource_instrumentation_library_spans[
                sdk_span.resource
            ].spans.append(CollectorSpan(**self._collector_span_kwargs))

        return ExportTraceServiceRequest(
            resource_spans=_get_resource_data(
                sdk_resource_instrumentation_library_spans,
                ResourceSpans,
                "spans",
            )
        )
Exemplo n.º 2
0
    def _translate_data(
            self, data: Sequence[MetricRecord]) -> ExportMetricsServiceRequest:
        # pylint: disable=too-many-locals,no-member
        # pylint: disable=attribute-defined-outside-init

        sdk_resource_instrumentation_library_metrics = {}

        for sdk_metric in data:

            if sdk_metric.instrument.meter.resource not in (
                    sdk_resource_instrumentation_library_metrics.keys()):
                sdk_resource_instrumentation_library_metrics[
                    sdk_metric.instrument.meter.
                    resource] = InstrumentationLibraryMetrics()

            self._metric_descriptor_kwargs = {}

            metric_descriptor = MetricDescriptor(
                name=sdk_metric.instrument.name,
                description=sdk_metric.instrument.description,
                unit=sdk_metric.instrument.unit,
                type=_get_type(sdk_metric.instrument.value_type),
                temporality=_get_temporality(sdk_metric.instrument),
            )

            if metric_descriptor.type == MetricDescriptor.Type.INT64:

                collector_metric = CollectorMetric(
                    metric_descriptor=metric_descriptor,
                    int64_data_points=_get_data_points(sdk_metric,
                                                       Int64DataPoint),
                )

            elif metric_descriptor.type == MetricDescriptor.Type.DOUBLE:

                collector_metric = CollectorMetric(
                    metric_descriptor=metric_descriptor,
                    double_data_points=_get_data_points(
                        sdk_metric, DoubleDataPoint),
                )

            sdk_resource_instrumentation_library_metrics[
                sdk_metric.instrument.meter.resource].metrics.append(
                    collector_metric)

        return ExportMetricsServiceRequest(resource_metrics=_get_resource_data(
            sdk_resource_instrumentation_library_metrics,
            ResourceMetrics,
            "metrics",
        ))
Exemplo n.º 3
0
    def _translate_data(self, data) -> ExportTraceServiceRequest:

        sdk_resource_instrumentation_library_spans = {}

        for sdk_span in data:

            if sdk_span.resource not in (
                    sdk_resource_instrumentation_library_spans.keys()):
                sdk_resource_instrumentation_library_spans[
                    sdk_span.resource] = InstrumentationLibrarySpans()

            self._collector_span_kwargs = {}

            self._translate_name(sdk_span)
            self._translate_start_time(sdk_span)
            self._translate_end_time(sdk_span)
            self._translate_span_id(sdk_span)
            self._translate_trace_id(sdk_span)
            self._translate_parent(sdk_span)
            self._translate_context_trace_state(sdk_span)
            self._translate_attributes(sdk_span)
            self._translate_events(sdk_span)
            self._translate_links(sdk_span)
            self._translate_status(sdk_span)

            self._collector_span_kwargs["kind"] = getattr(
                CollectorSpan.SpanKind, sdk_span.kind.name)

            sdk_resource_instrumentation_library_spans[
                sdk_span.resource].spans.append(
                    CollectorSpan(**self._collector_span_kwargs))

        return ExportTraceServiceRequest(resource_spans=_get_resource_data(
            sdk_resource_instrumentation_library_spans,
            ResourceSpans,
            "spans",
        ))
Exemplo n.º 4
0
    def _translate_data(
            self, data: Sequence[MetricRecord]) -> ExportMetricsServiceRequest:
        # pylint: disable=too-many-locals,no-member
        # pylint: disable=attribute-defined-outside-init

        sdk_resource_instrumentation_library_metrics = {}

        # The criteria to decide how to translate data is based on this table
        # taken directly from OpenTelemetry Proto v0.5.0:

        # TODO: Update table after the decision on:
        # https://github.com/open-telemetry/opentelemetry-specification/issues/731.
        # By default, metrics recording using the OpenTelemetry API are exported as
        # (the table does not include MeasurementValueType to avoid extra rows):
        #
        #   Instrument         Type
        #   ----------------------------------------------
        #   Counter            Sum(aggregation_temporality=delta;is_monotonic=true)
        #   UpDownCounter      Sum(aggregation_temporality=delta;is_monotonic=false)
        #   ValueRecorder      TBD
        #   SumObserver        Sum(aggregation_temporality=cumulative;is_monotonic=true)
        #   UpDownSumObserver  Sum(aggregation_temporality=cumulative;is_monotonic=false)
        #   ValueObserver      Gauge()
        for sdk_metric in data:

            if sdk_metric.resource not in (
                    sdk_resource_instrumentation_library_metrics.keys()):
                sdk_resource_instrumentation_library_metrics[
                    sdk_metric.resource] = InstrumentationLibraryMetrics()

            type_class = {
                int: {
                    "sum": {
                        "class": IntSum,
                        "argument": "int_sum"
                    },
                    "gauge": {
                        "class": IntGauge,
                        "argument": "int_gauge"
                    },
                    "data_point_class": IntDataPoint,
                },
                float: {
                    "sum": {
                        "class": DoubleSum,
                        "argument": "double_sum"
                    },
                    "gauge": {
                        "class": DoubleGauge,
                        "argument": "double_gauge",
                    },
                    "data_point_class": DoubleDataPoint,
                },
            }

            value_type = sdk_metric.instrument.value_type

            sum_class = type_class[value_type]["sum"]["class"]
            gauge_class = type_class[value_type]["gauge"]["class"]
            data_point_class = type_class[value_type]["data_point_class"]

            if isinstance(sdk_metric.instrument, Counter):
                otlp_metric_data = sum_class(
                    data_points=_get_data_points(sdk_metric, data_point_class),
                    aggregation_temporality=(
                        AggregationTemporality.AGGREGATION_TEMPORALITY_DELTA),
                    is_monotonic=True,
                )
                argument = type_class[value_type]["sum"]["argument"]

            elif isinstance(sdk_metric.instrument, UpDownCounter):
                otlp_metric_data = sum_class(
                    data_points=_get_data_points(sdk_metric, data_point_class),
                    aggregation_temporality=(
                        AggregationTemporality.AGGREGATION_TEMPORALITY_DELTA),
                    is_monotonic=False,
                )
                argument = type_class[value_type]["sum"]["argument"]

            elif isinstance(sdk_metric.instrument, (ValueRecorder)):
                logger.warning("Skipping exporting of ValueRecorder metric")
                continue

            elif isinstance(sdk_metric.instrument, SumObserver):
                otlp_metric_data = sum_class(
                    data_points=_get_data_points(sdk_metric, data_point_class),
                    aggregation_temporality=(
                        AggregationTemporality.
                        AGGREGATION_TEMPORALITY_CUMULATIVE),
                    is_monotonic=True,
                )
                argument = type_class[value_type]["sum"]["argument"]

            elif isinstance(sdk_metric.instrument, UpDownSumObserver):
                otlp_metric_data = sum_class(
                    data_points=_get_data_points(sdk_metric, data_point_class),
                    aggregation_temporality=(
                        AggregationTemporality.
                        AGGREGATION_TEMPORALITY_CUMULATIVE),
                    is_monotonic=False,
                )
                argument = type_class[value_type]["sum"]["argument"]

            elif isinstance(sdk_metric.instrument, (ValueObserver)):
                otlp_metric_data = gauge_class(
                    data_points=_get_data_points(sdk_metric, data_point_class))
                argument = type_class[value_type]["gauge"]["argument"]

            sdk_resource_instrumentation_library_metrics[
                sdk_metric.resource].metrics.append(
                    OTLPMetric(
                        **{
                            "name": sdk_metric.instrument.name,
                            "description": sdk_metric.instrument.description,
                            "unit": sdk_metric.instrument.unit,
                            argument: otlp_metric_data,
                        }))

        return ExportMetricsServiceRequest(resource_metrics=_get_resource_data(
            sdk_resource_instrumentation_library_metrics,
            ResourceMetrics,
            "metrics",
        ))