"""Example telemetry providers."""
from __future__ import annotations
import logging
from typing import Any, Dict
from secure_mcp_gateway.plugins.telemetry.base import (
TelemetryLevel,
TelemetryProvider,
TelemetryResult,
)
from secure_mcp_gateway.utils import logger
# ============================================================================
# Console Provider (Simple Logging)
# ============================================================================
class ConsoleTelemetryProvider(TelemetryProvider):
"""
Simple console-based telemetry provider.
Logs everything to console using Python's logging module.
Useful for development and debugging.
"""
def __init__(self):
self._logger = None
self._initialized = False
@property
def name(self) -> str:
return "console"
@property
def version(self) -> str:
return "1.0.0"
def initialize(self, config: dict[str, Any]) -> TelemetryResult:
"""Initialize console logging"""
try:
log_level = config.get("level", "INFO")
# Create logger
self._logger = logging.getLogger("enkrypt-console")
self._logger.setLevel(getattr(logging, log_level.upper()))
# Add console handler if not exists
if not self._logger.handlers:
handler = logging.StreamHandler()
formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
handler.setFormatter(formatter)
self._logger.addHandler(handler)
self._initialized = True
return TelemetryResult(
success=True,
provider_name=self.name,
message="Console telemetry initialized",
)
except Exception as e:
return TelemetryResult(
success=False,
provider_name=self.name,
error=str(e),
)
def create_logger(self, name: str) -> Any:
"""Return the logger"""
return self._logger
def create_tracer(self, name: str) -> Any:
"""Console provider doesn't support tracing"""
return None
# ============================================================================
# Datadog Provider (Stub)
# ============================================================================
class DatadogTelemetryProvider(TelemetryProvider):
"""
Datadog telemetry provider.
This is a stub implementation showing how to integrate with Datadog.
To use: pip install ddtrace
"""
def __init__(self, api_key: str, app_key: str | None = None):
self.api_key = api_key
self.app_key = app_key
self._logger = None
self._tracer = None
self._initialized = False
@property
def name(self) -> str:
return "datadog"
@property
def version(self) -> str:
return "1.0.0"
def initialize(self, config: dict[str, Any]) -> TelemetryResult:
"""
Initialize Datadog integration.
Config:
- api_key: Datadog API key
- app_key: Datadog application key (optional)
- service_name: Service name
- environment: Environment (prod, staging, dev)
"""
try:
logger.info(f"[{self.name}] Initializing Datadog provider...")
# Import Datadog tracer
try:
from ddtrace import patch_all, tracer
# Patch all supported libraries
patch_all()
# Configure tracer
tracer.configure(
hostname=config.get("hostname", "localhost"),
port=config.get("port", 8126),
)
self._tracer = tracer
self._initialized = True
logger.info(f"[{self.name}] ✓ Datadog initialized")
return TelemetryResult(
success=True,
provider_name=self.name,
message="Datadog initialized successfully",
)
except ImportError:
return TelemetryResult(
success=False,
provider_name=self.name,
error="ddtrace not installed. Run: pip install ddtrace",
)
except Exception as e:
logger.error(f"[{self.name}] ✗ Failed: {e}")
return TelemetryResult(
success=False,
provider_name=self.name,
error=str(e),
)
def create_logger(self, name: str) -> Any:
"""Create Datadog logger"""
import logging
return logging.getLogger(name)
def create_tracer(self, name: str) -> Any:
"""Return Datadog tracer"""
return self._tracer
# ============================================================================
# New Relic Provider (Stub)
# ============================================================================
class NewRelicTelemetryProvider(TelemetryProvider):
"""
New Relic telemetry provider.
This is a stub implementation showing how to integrate with New Relic.
To use: pip install newrelic
"""
def __init__(self, license_key: str):
self.license_key = license_key
self._initialized = False
@property
def name(self) -> str:
return "newrelic"
@property
def version(self) -> str:
return "1.0.0"
def initialize(self, config: dict[str, Any]) -> TelemetryResult:
"""
Initialize New Relic integration.
Config:
- license_key: New Relic license key
- app_name: Application name
- environment: Environment
"""
try:
logger.info(f"[{self.name}] Initializing New Relic provider...")
try:
import newrelic.agent
# Initialize New Relic
newrelic.agent.initialize(
config_file=config.get("config_file"),
environment=config.get("environment", "production"),
)
self._initialized = True
logger.info(f"[{self.name}] ✓ New Relic initialized")
return TelemetryResult(
success=True,
provider_name=self.name,
message="New Relic initialized successfully",
)
except ImportError:
return TelemetryResult(
success=False,
provider_name=self.name,
error="newrelic not installed. Run: pip install newrelic",
)
except Exception as e:
logger.error(f"[{self.name}] ✗ Failed: {e}")
return TelemetryResult(
success=False,
provider_name=self.name,
error=str(e),
)
def create_logger(self, name: str) -> Any:
"""Create logger"""
import logging
return logging.getLogger(name)
def create_tracer(self, name: str) -> Any:
"""New Relic uses decorators, not explicit tracers"""
return None
# ============================================================================
# Prometheus Provider (Stub)
# ============================================================================
class PrometheusTelemetryProvider(TelemetryProvider):
"""
Prometheus telemetry provider.
This is a stub implementation showing how to integrate with Prometheus.
To use: pip install prometheus-client
"""
def __init__(self, port: int = 8000):
self.port = port
self._initialized = False
@property
def name(self) -> str:
return "prometheus"
@property
def version(self) -> str:
return "1.0.0"
def initialize(self, config: dict[str, Any]) -> TelemetryResult:
"""
Initialize Prometheus metrics.
Config:
- port: Port for metrics endpoint
- namespace: Metrics namespace
"""
try:
logger.info(f"[{self.name}] Initializing Prometheus provider...")
try:
from prometheus_client import start_http_server
# Start metrics server
start_http_server(self.port)
self._initialized = True
logger.info(f"[{self.name}] ✓ Prometheus metrics on port {self.port}")
return TelemetryResult(
success=True,
provider_name=self.name,
message=f"Prometheus initialized on port {self.port}",
)
except ImportError:
return TelemetryResult(
success=False,
provider_name=self.name,
error="prometheus-client not installed. Run: pip install prometheus-client",
)
except Exception as e:
logger.error(f"[{self.name}] ✗ Failed: {e}")
return TelemetryResult(
success=False,
provider_name=self.name,
error=str(e),
)
def create_logger(self, name: str) -> Any:
"""Create logger"""
import logging
return logging.getLogger(name)
def create_tracer(self, name: str) -> Any:
"""Prometheus doesn't use tracers"""
return None
# ============================================================================
# Custom Provider Template
# ============================================================================
class CustomTelemetryProvider(TelemetryProvider):
"""
Template for creating custom telemetry providers.
Copy this class and implement the required methods for your telemetry backend.
"""
def __init__(self, **kwargs):
"""Initialize with custom configuration"""
self._config = kwargs
self._initialized = False
self._logger = None
self._tracer = None
@property
def name(self) -> str:
"""Return your provider name"""
return "custom"
@property
def version(self) -> str:
"""Return your provider version"""
return "1.0.0"
def initialize(self, config: dict[str, Any]) -> TelemetryResult:
"""
Initialize your telemetry backend.
Implement your initialization logic here:
1. Connect to your telemetry service
2. Configure authentication
3. Set up logging/tracing/metrics
4. Return TelemetryResult
"""
try:
logger.info(f"[{self.name}] Initializing custom provider...")
# TODO: Implement your initialization logic
self._initialized = True
logger.info(f"[{self.name}] ✓ Custom provider initialized")
return TelemetryResult(
success=True,
provider_name=self.name,
message="Custom provider initialized",
)
except Exception as e:
logger.error(f"[{self.name}] ✗ Failed: {e}")
return TelemetryResult(
success=False,
provider_name=self.name,
error=str(e),
)
def create_logger(self, name: str) -> Any:
"""
Create and return a logger instance.
This should return an object compatible with Python's logging interface.
"""
# TODO: Implement logger creation
import logging
return logging.getLogger(name)
def create_tracer(self, name: str) -> Any:
"""
Create and return a tracer instance.
This should return an object compatible with OpenTelemetry's tracer interface.
"""
# TODO: Implement tracer creation
return None
__all__ = [
"ConsoleTelemetryProvider",
"DatadogTelemetryProvider",
"NewRelicTelemetryProvider",
"PrometheusTelemetryProvider",
"CustomTelemetryProvider",
]