Files
sunbeam-charms/ops-sunbeam/ops_sunbeam/tracing.py
Guillaume Boutry e5fb16d6b9 Implement tracing
Implement tracing relation for all the charms.
Instrument most of ops.Object objects, including relation handlers,
pebble handlers, and relation objects.

Change-Id: I967ff858a63aa7d30094cf5a46491fce11195060
Signed-off-by: Guillaume Boutry <guillaume.boutry@canonical.com>
2024-07-31 11:57:32 +02:00

131 lines
3.0 KiB
Python

# Copyright 2024 Canonical Ltd.
#
# 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.
"""Utilities for tracing."""
from typing import (
Any,
Callable,
Optional,
Sequence,
TypeVar,
overload,
)
_T = TypeVar("_T")
try:
from charms.tempo_k8s.v1.charm_tracing import (
trace_type,
)
except ImportError:
def trace_type(cls: _T) -> _T:
"""No-op decorator for tracing."""
return cls
try:
from charms.tempo_k8s.v1.charm_tracing import (
trace_charm,
)
except ImportError:
def trace_charm(
tracing_endpoint: str,
server_cert: Optional[str] = None,
service_name: Optional[str] = None,
extra_types: Sequence[type] = (),
) -> Callable[[_T], _T]:
"""No-op decorator for tracing."""
def _wrapper(charm_cls: _T) -> _T:
return charm_cls
return _wrapper
@overload
def trace_sunbeam_charm(
*,
tracing_endpoint: str = "get_tracing_endpoint",
server_cert: Optional[str] = None,
service_name: Optional[str] = None,
extra_types: Sequence[type] = (),
) -> Callable[[_T], _T]:
... # fmt: skip
@overload
def trace_sunbeam_charm(
charm_cls: _T,
/,
) -> _T:
... # fmt: skip
def trace_sunbeam_charm(*args, **kwargs) -> Any:
"""Decorator for tracing sunbeam charms.
This decorator allows either decorating a charm class directly or
passing parameters to the decorator.
Usage:
@trace_sunbeam_charm
class MyCharm(...):
...
or
@trace_sunbeam_charm(
tracing_endpoint="get_tracing_endpoint",
server_cert="path/to/server.crt",
service_name="my-service",
extra_types=(MyType,),
)
class MyCharm(...):
...
or
class MyCharm(...):
...
MyCharm = trace_sunbeam_charm(MyCharm)
or
MyCharm = trace_sunbeam_charm(
tracing_endpoint="get_tracing_endpoint",
server_cert="path/to/server.crt",
service_name="my-service",
extra_types=(MyType,),
)(MyCharm)
"""
if len(args) == 1 and not kwargs:
charm_cls = args[0]
return trace_charm(
tracing_endpoint="get_tracing_endpoint",
)(charm_cls)
return trace_charm(
tracing_endpoint=kwargs.get(
"tracing_endpoint", "get_tracing_endpoint"
),
server_cert=kwargs.get("server_cert"),
service_name=kwargs.get("service_name"),
extra_types=kwargs.get("extra_types", ()),
)