blob: 4d4d7dbb81c7f99be3a2edb7350d2b4b9c3022d7 [file] [log] [blame]
# Copyright 2023 gRPC authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import annotations
import abc
from dataclasses import dataclass
from dataclasses import field
import enum
from typing import AnyStr, Dict, List, Mapping, Set, Tuple
class Exporter(metaclass=abc.ABCMeta):
"""Abstract base class for census data exporters."""
@abc.abstractmethod
def export_stats_data(self, stats_data: List[TracingData]) -> None:
"""Exports a list of TracingData objects to the exporter's destination.
Args:
stats_data: A list of TracingData objects to export.
"""
raise NotImplementedError()
@abc.abstractmethod
def export_tracing_data(self, tracing_data: List[StatsData]) -> None:
"""Exports a list of StatsData objects to the exporter's destination.
Args:
tracing_data: A list of StatsData objects to export.
"""
raise NotImplementedError()
@dataclass(frozen=True)
class StatsData:
"""A data class representing stats data.
Attributes:
name: An element of grpc_observability._cyobservability.MetricsName, e.g.
MetricsName.CLIENT_STARTED_RPCS.
measure_double: A bool indicate whether the metric is a floating-point
value.
value_int: The actual metric value if measure_double is False.
value_float: The actual metric value if measure_double is True.
include_exchange_labels: Whether this data should include exchanged labels.
labels: A dictionary that maps label tags associated with this metric to
corresponding label value.
identifiers: A set of strings identifying which stats plugins this StatsData
belongs to.
registered_method: Whether the method in this data is a registered method
in stubs.
"""
name: "grpc_observability._cyobservability.MetricsName"
measure_double: bool
value_int: int = 0
value_float: float = 0.0
include_exchange_labels: bool = False
labels: Dict[str, AnyStr] = field(default_factory=dict)
identifiers: Set[str] = field(default_factory=set)
registered_method: bool = False
@dataclass(frozen=True)
class TracingData:
"""A data class representing tracing data.
Attributes:
name: The name for tracing data, also the name for the Span.
start_time: The start time for the span in RFC3339 UTC "Zulu" format, e.g.
2014-10-02T15:01:23Z
end_time: The end time for the span in RFC3339 UTC "Zulu" format, e.g.
2014-10-02T15:01:23Z
trace_id: The identifier for the trace associated with this span as a
32-character hexadecimal encoded string,
e.g. 26ed0036f2eff2b7317bccce3e28d01f
span_id: The identifier for the span as a 16-character hexadecimal encoded
string. e.g. 113ec879e62583bc
parent_span_id: An option identifier for the span's parent id.
status: An element of grpc.StatusCode in string format representing the
final status for the trace data.
should_sample: A bool indicates whether the span is sampled.
child_span_count: The number of child span associated with this span.
span_labels: A dictionary that maps labels tags associated with this
span to corresponding label value.
span_annotations: A dictionary that maps annotation timeStamp with
description. The timeStamp have a format which can be converted
to Python datetime.datetime, e.g. 2023-05-29 17:07:09.895
"""
name: str
start_time: str
end_time: str
trace_id: str
span_id: str
parent_span_id: str
status: str
should_sample: bool
child_span_count: int
span_labels: Mapping[str, AnyStr] = field(default_factory=dict)
span_annotations: List[Tuple[str, str]] = field(default_factory=list)
@enum.unique
class OptionalLabelType(enum.Enum):
"""What kinds of optional labels to add to metrics."""
XDS_SERVICE_LABELS = "kXdsServiceLabels"