4b6817381b
CI (OpenClaw E2E) / openclaw test (push) Has been cancelled
CI / coverage-report (push) Has been cancelled
CI / test-kubernetes (push) Has been cancelled
CI / should-run-thorough (push) Has been cancelled
CI / test-thorough (cloudwatch-demo) (push) Has been cancelled
CI / test-thorough (flink-ecs) (push) Has been cancelled
CI / test-thorough (upstream-lambda) (push) Has been cancelled
CI / test-thorough (prefect-ecs-fargate) (push) Has been cancelled
Release / build-binaries (zip, opensre.exe, onefile, windows-latest, windows-x64) (push) Has been cancelled
Benchmark image — build + push to ECR (any adapter) / build + push (push) Has been cancelled
CI / quality (ubuntu-latest) (push) Has been cancelled
CI / test (tools-runtime) (push) Has been cancelled
CI / test (e2e-general) (push) Has been cancelled
CI / test (cli-runtime) (push) Has been cancelled
CI / test (e2e-provider-and-openclaw) (push) Has been cancelled
CI / test (integrations-and-misc) (push) Has been cancelled
Release / verify (push) Has been cancelled
Release / build-python-dist (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, macos-15-intel, darwin-x64) (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, macos-latest, darwin-arm64) (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, ubuntu-22.04, linux-x64) (push) Has been cancelled
Release / publish-release (push) Has been cancelled
Release / publish-main-release (push) Has been cancelled
Interactive Shell Live (PR + post-merge) / turn-checks (no-LLM) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Interactive Shell Live (PR + post-merge) / turn-live shard ${{ matrix.shard_index }} (push) Has been cancelled
Release / prepare (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, ubuntu-22.04-arm, linux-arm64) (push) Has been cancelled
Synthetic Deterministic Tests / Synthetic offline (deterministic) (push) Has been cancelled
213 lines
6.8 KiB
Python
213 lines
6.8 KiB
Python
"""Tests for SigNoz tools."""
|
|
|
|
from typing import Any
|
|
|
|
from integrations.signoz.tools import (
|
|
_metrics_is_available,
|
|
query_signoz_logs,
|
|
query_signoz_metrics,
|
|
query_signoz_traces,
|
|
)
|
|
|
|
|
|
class _FakeSigNozBackend:
|
|
"""Fake backend for synthetic tests."""
|
|
|
|
def query_logs(self, **_kwargs: Any) -> dict[str, Any]:
|
|
return {
|
|
"source": "signoz_logs",
|
|
"available": True,
|
|
"total": 2,
|
|
"logs": [
|
|
{
|
|
"timestamp": "2024-01-01T00:00:00Z",
|
|
"severity": "ERROR",
|
|
"severity_number": 17,
|
|
"message": "connection refused",
|
|
"trace_id": "abc123",
|
|
"span_id": "def456",
|
|
"attributes": {"http.method": "GET"},
|
|
"resources": {"service.name": "api"},
|
|
},
|
|
{
|
|
"timestamp": "2024-01-01T00:01:00Z",
|
|
"severity": "INFO",
|
|
"severity_number": 9,
|
|
"message": "request completed",
|
|
"trace_id": "",
|
|
"span_id": "",
|
|
"attributes": {},
|
|
"resources": {"service.name": "api"},
|
|
},
|
|
],
|
|
}
|
|
|
|
def query_metrics(self, **kwargs: Any) -> dict[str, Any]:
|
|
return {
|
|
"source": "signoz_metrics",
|
|
"available": True,
|
|
"total": 2,
|
|
"metric_name": kwargs.get("metric_name"),
|
|
"resolved_metric": kwargs.get("metric_name"),
|
|
"aggregation": kwargs.get("aggregation"),
|
|
"metrics": [
|
|
{
|
|
"interval": "2024-01-01 00:00:00",
|
|
"value": 42.0,
|
|
"metric_name": kwargs.get("metric_name"),
|
|
"service_name": kwargs.get("service") or "",
|
|
},
|
|
],
|
|
}
|
|
|
|
def query_traces(self, **kwargs: Any) -> dict[str, Any]:
|
|
return {
|
|
"source": "signoz_traces",
|
|
"available": True,
|
|
"total": 1,
|
|
"traces": [
|
|
{
|
|
"timestamp": "2024-01-01T00:00:00Z",
|
|
"trace_id": "abc123",
|
|
"span_id": "span1",
|
|
"name": "GET /api/health",
|
|
"duration_ms": 150.0,
|
|
"has_error": True,
|
|
"status_code": 2,
|
|
"status_code_string": "Error",
|
|
"http_method": "GET",
|
|
"http_url": "/api/health",
|
|
"kind_string": "Server",
|
|
"service_name": kwargs.get("service") or "api",
|
|
},
|
|
],
|
|
}
|
|
|
|
def query_trace_summary(self, **_kwargs: Any) -> dict[str, Any]:
|
|
return {
|
|
"source": "signoz_traces",
|
|
"available": True,
|
|
"total_spans": 100,
|
|
"error_spans": 5,
|
|
"error_rate": 0.05,
|
|
"p99_ms": 250.0,
|
|
"p95_ms": 180.0,
|
|
"avg_ms": 120.0,
|
|
"max_ms": 500.0,
|
|
}
|
|
|
|
|
|
class TestQuerySignozLogs:
|
|
def test_available_with_query_api_credentials_only(self) -> None:
|
|
from integrations.signoz.tools import _logs_is_available
|
|
|
|
assert (
|
|
_logs_is_available(
|
|
{
|
|
"signoz": {
|
|
"url": "http://localhost:8080",
|
|
"api_key": "test-key",
|
|
"connection_verified": False,
|
|
}
|
|
}
|
|
)
|
|
is True
|
|
)
|
|
|
|
def test_backend_injection(self) -> None:
|
|
backend = _FakeSigNozBackend()
|
|
result = query_signoz_logs(
|
|
service="api",
|
|
time_range_minutes=60,
|
|
severity="ERROR",
|
|
limit=10,
|
|
signoz_backend=backend,
|
|
)
|
|
assert result["source"] == "signoz_logs"
|
|
assert result["available"] is True
|
|
assert result["total"] == 2
|
|
assert len(result["logs"]) == 2
|
|
assert len(result["error_logs"]) == 1
|
|
assert result["error_logs"][0]["severity"] == "ERROR"
|
|
|
|
def test_not_configured_without_backend(self) -> None:
|
|
result = query_signoz_logs(service="api")
|
|
assert result["source"] == "signoz_logs"
|
|
assert result["available"] is False
|
|
assert "not configured" in result.get("error", "").lower()
|
|
|
|
|
|
class TestQuerySignozMetrics:
|
|
def test_backend_injection(self) -> None:
|
|
backend = _FakeSigNozBackend()
|
|
result = query_signoz_metrics(
|
|
metric_name="cpu_usage",
|
|
service="api",
|
|
time_range_minutes=60,
|
|
aggregation="avg",
|
|
limit=10,
|
|
signoz_backend=backend,
|
|
)
|
|
assert result["source"] == "signoz_metrics"
|
|
assert result["available"] is True
|
|
assert result["metric_name"] == "cpu_usage"
|
|
assert len(result["metrics"]) == 1
|
|
|
|
def test_not_configured_without_backend(self) -> None:
|
|
result = query_signoz_metrics(metric_name="cpu_usage")
|
|
assert result["source"] == "signoz_metrics"
|
|
assert result["available"] is False
|
|
assert "not configured" in result.get("error", "").lower()
|
|
|
|
def test_available_with_metrics_api_credentials_only(self) -> None:
|
|
assert (
|
|
_metrics_is_available(
|
|
{
|
|
"signoz": {
|
|
"url": "http://localhost:8080",
|
|
"api_key": "test-key",
|
|
"connection_verified": False,
|
|
}
|
|
}
|
|
)
|
|
is True
|
|
)
|
|
|
|
|
|
class TestQuerySignozTraces:
|
|
def test_available_with_query_api_credentials_only(self) -> None:
|
|
from integrations.signoz.tools import _traces_is_available
|
|
|
|
assert (
|
|
_traces_is_available(
|
|
{
|
|
"signoz": {
|
|
"url": "http://localhost:8080",
|
|
"api_key": "test-key",
|
|
"connection_verified": False,
|
|
}
|
|
}
|
|
)
|
|
is True
|
|
)
|
|
|
|
def test_backend_injection(self) -> None:
|
|
backend = _FakeSigNozBackend()
|
|
result = query_signoz_traces(
|
|
service="api",
|
|
time_range_minutes=60,
|
|
error_only=True,
|
|
limit=10,
|
|
signoz_backend=backend,
|
|
)
|
|
assert result["source"] == "signoz_traces"
|
|
assert result["available"] is True
|
|
assert result["total"] == 1
|
|
assert result["summary"]["error_rate"] == 0.05
|
|
|
|
def test_not_configured_without_backend(self) -> None:
|
|
result = query_signoz_traces(service="api")
|
|
assert result["source"] == "signoz_traces"
|
|
assert result["available"] is False
|
|
assert "not configured" in result.get("error", "").lower()
|