From b5711ae65223c14812bd2e401e6afee3a1ba14f7 Mon Sep 17 00:00:00 2001 From: shayancanonical <99665202+shayancanonical@users.noreply.github.com> Date: Fri, 4 Oct 2024 19:22:20 -0400 Subject: [PATCH] Integrate with Tempo HA + test relay support of tracing traffic through grafana-agent-k8s (#725) --- .../v0}/charm_tracing.py | 35 +++++++++---------- .../v0}/tracing.py | 18 +++++----- pyproject.toml | 4 +-- src/charm.py | 4 +-- tests/unit/conftest.py | 2 +- 5 files changed, 31 insertions(+), 32 deletions(-) rename lib/charms/{tempo_k8s/v1 => tempo_coordinator_k8s/v0}/charm_tracing.py (96%) rename lib/charms/{tempo_k8s/v2 => tempo_coordinator_k8s/v0}/tracing.py (98%) diff --git a/lib/charms/tempo_k8s/v1/charm_tracing.py b/lib/charms/tempo_coordinator_k8s/v0/charm_tracing.py similarity index 96% rename from lib/charms/tempo_k8s/v1/charm_tracing.py rename to lib/charms/tempo_coordinator_k8s/v0/charm_tracing.py index 2dbdddd684..2604c39e6c 100644 --- a/lib/charms/tempo_k8s/v1/charm_tracing.py +++ b/lib/charms/tempo_coordinator_k8s/v0/charm_tracing.py @@ -12,15 +12,15 @@ # Quickstart Fetch the following charm libs (and ensure the minimum version/revision numbers are satisfied): - charmcraft fetch-lib charms.tempo_k8s.v2.tracing # >= 1.10 - charmcraft fetch-lib charms.tempo_k8s.v1.charm_tracing # >= 2.7 + charmcraft fetch-lib charms.tempo_coordinator_k8s.v0.tracing # >= 1.10 + charmcraft fetch-lib charms.tempo_coordinator_k8s.v0.charm_tracing # >= 2.7 Then edit your charm code to include: ```python # import the necessary charm libs -from charms.tempo_k8s.v2.tracing import TracingEndpointRequirer, charm_tracing_config -from charms.tempo_k8s.v1.charm_tracing import charm_tracing +from charms.tempo_coordinator_k8s.v0.tracing import TracingEndpointRequirer, charm_tracing_config +from charms.tempo_coordinator_k8s.v0.charm_tracing import charm_tracing # decorate your charm class with charm_tracing: @charm_tracing( @@ -51,7 +51,7 @@ def __init__(self, ...): 2) add to your charm a "my_tracing_endpoint" (you can name this attribute whatever you like) **property**, **method** or **instance attribute** that returns an otlp http/https endpoint url. -If you are using the ``charms.tempo_k8s.v2.tracing.TracingEndpointRequirer`` as +If you are using the ``charms.tempo_coordinator_k8s.v0.tracing.TracingEndpointRequirer`` as ``self.tracing = TracingEndpointRequirer(self)``, the implementation could be: ``` @@ -80,7 +80,7 @@ def my_tracing_endpoint(self) -> Optional[str]: For example: ``` -from charms.tempo_k8s.v1.charm_tracing import trace_charm +from charms.tempo_coordinator_k8s.v0.charm_tracing import trace_charm @trace_charm( tracing_endpoint="my_tracing_endpoint", server_cert="_server_cert" @@ -129,7 +129,7 @@ def get_tracer(self) -> opentelemetry.trace.Tracer: For example: ``` - from charms.tempo_k8s.v0.charm_tracing import trace_charm + from charms.tempo_coordinator_k8s.v0.charm_tracing import trace_charm @trace_charm( tracing_endpoint="my_tracing_endpoint", @@ -150,7 +150,7 @@ def my_tracing_endpoint(self) -> Optional[str]: needs to be replaced with: ``` - from charms.tempo_k8s.v1.charm_tracing import trace_charm + from charms.tempo_coordinator_k8s.v0.charm_tracing import trace_charm @trace_charm( tracing_endpoint="my_tracing_endpoint", @@ -249,28 +249,27 @@ def _remove_stale_otel_sdk_packages(): from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import Span, TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor +from opentelemetry.trace import INVALID_SPAN, Tracer +from opentelemetry.trace import get_current_span as otlp_get_current_span from opentelemetry.trace import ( - INVALID_SPAN, - Tracer, get_tracer, get_tracer_provider, set_span_in_context, set_tracer_provider, ) -from opentelemetry.trace import get_current_span as otlp_get_current_span from ops.charm import CharmBase from ops.framework import Framework # The unique Charmhub library identifier, never change it -LIBID = "cb1705dcd1a14ca09b2e60187d1215c7" +LIBID = "01780f1e588c42c3976d26780fdf9b89" # Increment this major API version when introducing breaking changes -LIBAPI = 1 +LIBAPI = 0 # Increment this PATCH version before using `charmcraft publish-lib` or reset # to 0 if you are raising the major API version -LIBPATCH = 15 +LIBPATCH = 1 PYDEPS = ["opentelemetry-exporter-otlp-proto-http==1.21.0"] @@ -332,7 +331,7 @@ def _get_tracer() -> Optional[Tracer]: return tracer.get() except LookupError: # fallback: this course-corrects for a user error where charm_tracing symbols are imported - # from different paths (typically charms.tempo_k8s... and lib.charms.tempo_k8s...) + # from different paths (typically charms.tempo_coordinator_k8s... and lib.charms.tempo_coordinator_k8s...) try: ctx: Context = copy_context() if context_tracer := _get_tracer_from_context(ctx): @@ -562,8 +561,8 @@ def trace_charm( method calls on instances of this class. Usage: - >>> from charms.tempo_k8s.v1.charm_tracing import trace_charm - >>> from charms.tempo_k8s.v1.tracing import TracingEndpointRequirer + >>> from charms.tempo_coordinator_k8s.v0.charm_tracing import trace_charm + >>> from charms.tempo_coordinator_k8s.v0.tracing import TracingEndpointRequirer >>> from ops import CharmBase >>> >>> @trace_charm( @@ -626,7 +625,7 @@ def _autoinstrument( Usage: - >>> from charms.tempo_k8s.v1.charm_tracing import _autoinstrument + >>> from charms.tempo_coordinator_k8s.v0.charm_tracing import _autoinstrument >>> from ops.main import main >>> _autoinstrument( >>> MyCharm, diff --git a/lib/charms/tempo_k8s/v2/tracing.py b/lib/charms/tempo_coordinator_k8s/v0/tracing.py similarity index 98% rename from lib/charms/tempo_k8s/v2/tracing.py rename to lib/charms/tempo_coordinator_k8s/v0/tracing.py index 81bf1f1f5f..4af379a5d2 100644 --- a/lib/charms/tempo_k8s/v2/tracing.py +++ b/lib/charms/tempo_coordinator_k8s/v0/tracing.py @@ -16,7 +16,7 @@ This relation must use the `tracing` interface. The `TracingEndpointRequirer` object may be instantiated as follows - from charms.tempo_k8s.v2.tracing import TracingEndpointRequirer + from charms.tempo_coordinator_k8s.v0.tracing import TracingEndpointRequirer def __init__(self, *args): super().__init__(*args) @@ -58,7 +58,7 @@ def __init__(self, *args): For example a Tempo charm may instantiate the `TracingEndpointProvider` in its constructor as follows - from charms.tempo_k8s.v2.tracing import TracingEndpointProvider + from charms.tempo_coordinator_k8s.v0.tracing import TracingEndpointProvider def __init__(self, *args): super().__init__(*args) @@ -100,14 +100,14 @@ def __init__(self, *args): from pydantic import BaseModel, Field # The unique Charmhub library identifier, never change it -LIBID = "12977e9aa0b34367903d8afeb8c3d85d" +LIBID = "d2f02b1f8d1244b5989fd55bc3a28943" # Increment this major API version when introducing breaking changes -LIBAPI = 2 +LIBAPI = 0 # Increment this PATCH version before using `charmcraft publish-lib` or reset # to 0 if you are raising the major API version -LIBPATCH = 10 +LIBPATCH = 1 PYDEPS = ["pydantic"] @@ -947,8 +947,8 @@ def charm_tracing_config( Usage: If you are using charm_tracing >= v1.9: - >>> from lib.charms.tempo_k8s.v1.charm_tracing import trace_charm - >>> from lib.charms.tempo_k8s.v2.tracing import charm_tracing_config + >>> from lib.charms.tempo_coordinator_k8s.v0.charm_tracing import trace_charm + >>> from lib.charms.tempo_coordinator_k8s.v0.tracing import charm_tracing_config >>> @trace_charm(tracing_endpoint="my_endpoint", cert_path="cert_path") >>> class MyCharm(...): >>> _cert_path = "/path/to/cert/on/charm/container.crt" @@ -958,8 +958,8 @@ def charm_tracing_config( ... self.tracing, self._cert_path) If you are using charm_tracing < v1.9: - >>> from lib.charms.tempo_k8s.v1.charm_tracing import trace_charm - >>> from lib.charms.tempo_k8s.v2.tracing import charm_tracing_config + >>> from lib.charms.tempo_coordinator_k8s.v0.charm_tracing import trace_charm + >>> from lib.charms.tempo_coordinator_k8s.v0.tracing import charm_tracing_config >>> @trace_charm(tracing_endpoint="my_endpoint", cert_path="cert_path") >>> class MyCharm(...): >>> _cert_path = "/path/to/cert/on/charm/container.crt" diff --git a/pyproject.toml b/pyproject.toml index e39485a62e..d87d85b752 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,11 +28,11 @@ ops = ">=2.0.0" poetry-core = "*" # data_platform_libs/v0/upgrade.py requires pydantic ^1.10 # grafana_agent/v0/cos_agent.py requires pydantic <2 -# tempo_k8s/v2/tracing.py supports both pydantic <2 and pydantic 2 +# tempo_coordinator_k8s/v0/tracing.py supports both pydantic <2 and pydantic 2 pydantic = "^1.10, <2" # grafana_agent/v0/cos_agent.py cosl = "*" -# tempo_k8s/v1/charm_tracing.py +# tempo_coordinator_k8s/v0/charm_tracing.py opentelemetry-exporter-otlp-proto-http = "1.21.0" [tool.poetry.group.format] diff --git a/src/charm.py b/src/charm.py index 84b3dcd218..b3e3b6f5aa 100755 --- a/src/charm.py +++ b/src/charm.py @@ -44,8 +44,8 @@ from charms.postgresql_k8s.v0.postgresql_tls import PostgreSQLTLS from charms.prometheus_k8s.v0.prometheus_scrape import MetricsEndpointProvider from charms.rolling_ops.v0.rollingops import RollingOpsManager, RunWithLock -from charms.tempo_k8s.v1.charm_tracing import trace_charm -from charms.tempo_k8s.v2.tracing import TracingEndpointRequirer +from charms.tempo_coordinator_k8s.v0.charm_tracing import trace_charm +from charms.tempo_coordinator_k8s.v0.tracing import TracingEndpointRequirer from lightkube import ApiError, Client from lightkube.models.core_v1 import ServicePort, ServiceSpec from lightkube.models.meta_v1 import ObjectMeta diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index 79dfa67261..eb0faf7410 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -3,7 +3,7 @@ from unittest.mock import PropertyMock import pytest -from charms.tempo_k8s.v1.charm_tracing import charm_tracing_disabled +from charms.tempo_coordinator_k8s.v0.charm_tracing import charm_tracing_disabled # This causes every test defined in this file to run 2 times, each with