Skip to content

Commit

Permalink
Merge pull request #485 from pehala/rework_tracing
Browse files Browse the repository at this point in the history
Rework tracing
  • Loading branch information
pehala committed Jul 11, 2024
2 parents 78181df + 4aa56bf commit e98eda7
Show file tree
Hide file tree
Showing 8 changed files with 94 additions and 52 deletions.
16 changes: 10 additions & 6 deletions testsuite/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
from testsuite.oidc import OIDCProvider
from testsuite.oidc.auth0 import Auth0Provider
from testsuite.oidc.keycloak import Keycloak
from testsuite.tracing import TracingClient
from testsuite.tracing.jaeger import JaegerClient
from testsuite.tracing.tempo import RemoteTempoClient
from testsuite.utils import randomize, _whoami


Expand Down Expand Up @@ -170,14 +171,17 @@ def tracing(testconfig, skip_or_fail):
"""Returns tracing client for tracing tests"""
try:
testconfig.validators.validate(only=["tracing"])
return TracingClient(
testconfig["tracing"]["backend"] == "jaeger",
except (KeyError, ValidationError) as exc:
skip_or_fail(f"Tracing configuration item is missing: {exc}")

cls = JaegerClient if testconfig["tracing"]["backend"] == "jaeger" else RemoteTempoClient
# Authorino needs to have verify disabled because it doesn't trust local service URLs
with KuadrantClient(verify=False) as client:
yield cls(
testconfig["tracing"]["collector_url"],
testconfig["tracing"]["query_url"],
KuadrantClient(verify=False),
client,
)
except (KeyError, ValidationError) as exc:
return skip_or_fail(f"Tracing configuration item is missing: {exc}")


@pytest.fixture(scope="session")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@
@pytest.fixture(scope="module")
def authorino_parameters(authorino_parameters, tracing):
"""Deploy authorino with tracing enabled"""
insecure_tracing = not tracing.client.verify
authorino_parameters["tracing"] = TracingOptions(endpoint=tracing.collector_url, insecure=insecure_tracing)
authorino_parameters["tracing"] = TracingOptions(endpoint=tracing.collector_url, insecure=tracing.insecure)
return authorino_parameters


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,5 @@ def test_tracing(client, auth, tracing):
request_id = extract_response(response) % None
assert request_id is not None

trace = tracing.find_trace(request_id, "authorino")
trace = tracing.search(request_id, "authorino")
assert len(trace) == 1
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,5 @@ def test_tracing_tags(client, auth, tracing):
request_id = extract_response(response) % None
assert request_id is not None

trace = tracing.find_tagged_trace(request_id, "authorino", {TAG_KEY: TAG_VALUE})
trace = tracing.search(request_id, "authorino", {TAG_KEY: TAG_VALUE})
assert len(trace) == 1
42 changes: 0 additions & 42 deletions testsuite/tracing.py

This file was deleted.

26 changes: 26 additions & 0 deletions testsuite/tracing/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
"""Module with Abstract Tracing client for traces management"""

import abc


class TracingClient(abc.ABC):
"""Tracing client for traces management"""

@property
@abc.abstractmethod
def insecure(self):
"""Returns True, if the connection to the client is insecure"""

@property
@abc.abstractmethod
def query_url(self):
"""Returns URL for clients to query"""

@property
@abc.abstractmethod
def collector_url(self):
"""Returns URL for application to deposit traces"""

@abc.abstractmethod
def search(self, request_id: str, service: str, tags: dict) -> list:
"""Search traces in tracing client by tags service name, `authorino.request_id` and tag"""
38 changes: 38 additions & 0 deletions testsuite/tracing/jaeger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
"""Jaeger Tracing client"""

import backoff
from apyproxy import ApyProxy
from httpx import Client

from testsuite.tracing import TracingClient


class JaegerClient(TracingClient):
"""Tracing client for traces management"""

def __init__(self, collector_url: str, query_url: str, client: Client):
self._collector_url = collector_url
self._query_url = query_url
self.query = ApyProxy(self.query_url, session=client)

@property
def insecure(self):
"""So far, we only support insecure tracing as we depend on internal service which is insecure by default"""
return True

@property
def collector_url(self):
return self._collector_url

@property
def query_url(self):
return self._query_url

@backoff.on_predicate(backoff.fibo, lambda x: x == [], max_tries=7, jitter=None)
def search(self, request_id: str, service: str, tags=None):
"""Gets trace from tracing backend Tempo or Jaeger"""
if tags is None:
tags = {}

tags.update({"service": service, "tags": f'{{"authorino.request_id":"{request_id}"}}'})
return self.query.api.traces.get(params=tags).json()["data"]
17 changes: 17 additions & 0 deletions testsuite/tracing/tempo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
"""Tempo tracing"""

import backoff

from testsuite.tracing.jaeger import JaegerClient


class RemoteTempoClient(JaegerClient):
"""Client to a Tempo that is deployed remotely"""

@backoff.on_predicate(backoff.fibo, lambda x: x == [], max_tries=7, jitter=None)
def search(self, request_id: str, service: str, tags=None):
if tags is None:
tags = {}

tags.update({"service.name": service, "authorino.request_id": request_id})
return self.query.api.search.get(params=tags).json()["traces"]

0 comments on commit e98eda7

Please sign in to comment.