
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>
131 lines
3.0 KiB
Python
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", ()),
|
|
)
|