@ -20,14 +20,15 @@ import sys
import time
from typing import Any , Callable , Dict , List , Optional , Set
import unittest
from unittest . mock import patch
import grpc
import grpc_observability
from grpc_observability import _open_telemetry_measures
from grpc_observability . _open_telemetry_plugin import GRPC_METHOD_LABEL
from grpc_observability . _open_telemetry_plugin import GRPC_OTHER_LABEL_VALUE
from grpc_observability . _open_telemetry_plugin import GRPC_TARGET_LABEL
from grpc_observability . _open_telemetry_observability import (
GRPC_OTHER_LABEL_VALUE ,
)
from grpc_observability . _open_telemetry_observability import GRPC_METHOD_LABEL
from grpc_observability . _open_telemetry_observability import GRPC_TARGET_LABEL
from opentelemetry . sdk . metrics import MeterProvider
from opentelemetry . sdk . metrics . export import AggregationTemporality
from opentelemetry . sdk . metrics . export import MetricExportResult
@ -94,14 +95,6 @@ class OTelMetricExporter(MetricExporter):
)
class BaseTestOpenTelemetryPlugin ( grpc_observability . OpenTelemetryPlugin ) :
def __init__ ( self , provider : MeterProvider ) :
self . provider = provider
def get_meter_provider ( self ) - > Optional [ MeterProvider ] :
return self . provider
class _ClientUnaryUnaryInterceptor ( grpc . UnaryUnaryClientInterceptor ) :
def intercept_unary_unary (
self , continuation , client_call_details , request_or_iterator
@ -136,9 +129,8 @@ class OpenTelemetryObservabilityTest(unittest.TestCase):
self . _server . stop ( 0 )
def testRecordUnaryUnaryUseContextManager ( self ) :
otel_plugin = BaseTestOpenTelemetryPlugin ( self . _provider )
with grpc_observability . OpenTelemetryObservability (
plugins = [ otel_plugin ]
with grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
) :
server , port = _test_server . start_server ( )
self . _server = server
@ -148,36 +140,42 @@ class OpenTelemetryObservabilityTest(unittest.TestCase):
self . _validate_all_metrics_names ( self . all_metrics )
def testRecordUnaryUnaryUseGlobalInit ( self ) :
otel_plugin = BaseTestOpenTelemetryPlugin ( self . _provider )
grpc_observability . start_open_telemetry_observability (
plugins = [ otel_plugin ]
otel_plugin = grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
)
otel_plugin . register_global ( )
server , port = _test_server . start_server ( )
self . _server = server
_test_server . unary_unary_call ( port = port )
self . _validate_metrics_exist ( self . all_metrics )
self . _validate_all_metrics_names ( self . all_metrics )
grpc_observability . end_open_telemetry_observability ( )
otel_plugin . deregister_global ( )
def testCallGlobalInitThrowErrorWhenGlobalCalled ( self ) :
grpc_observability . start_open_telemetry_observability ( plugins = [ ] )
otel_plugin = grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
)
otel_plugin . register_global ( )
try :
grpc_observability . start_open_telemetry_observability ( plugins = [ ] )
otel_plugin . register_global ( )
except RuntimeError as exp :
self . assertIn (
" gPRC Python observability was already initialized " , str ( exp )
)
grpc_observability . end_open_telemetry_observability ( )
otel_plugin . deregister_global ( )
def testCallGlobalInitThrowErrorWhenContextManagerCalled ( self ) :
with grpc_observability . OpenTelemetryObservability ( plugins = [ ] ) :
with grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
) :
try :
grpc_observability . start_open_telemetry_observability (
plugins = [ ]
otel_plugin = grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
)
otel_plugin . register_global ( )
except RuntimeError as exp :
self . assertIn (
" gPRC Python observability was already initialized " ,
@ -185,20 +183,29 @@ class OpenTelemetryObservabilityTest(unittest.TestCase):
)
def testCallContextManagerThrowErrorWhenGlobalInitCalled ( self ) :
grpc_observability . start_open_telemetry_observability ( plugins = [ ] )
otel_plugin = grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
)
otel_plugin . register_global ( )
try :
with grpc_observability . OpenTelemetryObservability ( plugins = [ ] ) :
with grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
) :
pass
except RuntimeError as exp :
self . assertIn (
" gPRC Python observability was already initialized " , str ( exp )
)
grpc_observability . end_open_telemetry_observability ( )
otel_plugin . deregister_global ( )
def testContextManagerThrowErrorWhenContextManagerCalled ( self ) :
with grpc_observability . OpenTelemetryObservability ( plugins = [ ] ) :
with grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
) :
try :
with grpc_observability . OpenTelemetryObservability ( plugins = [ ] ) :
with grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
) :
pass
except RuntimeError as exp :
self . assertIn (
@ -207,23 +214,32 @@ class OpenTelemetryObservabilityTest(unittest.TestCase):
)
def testNoErrorCallGlobalInitThenContextManager ( self ) :
grpc_observability . start_open_telemetry_observability ( plugins = [ ] )
grpc_observability . end_open_telemetry_observability ( )
otel_plugin = grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
)
otel_plugin . register_global ( )
otel_plugin . deregister_global ( )
with grpc_observability . OpenTelemetryObservability ( plugins = [ ] ) :
with grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
) :
pass
def testNoErrorCallContextManagerThenGlobalInit ( self ) :
with grpc_observability . OpenTelemetryObservability ( plugins = [ ] ) :
with grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
) :
pass
grpc_observability . start_open_telemetry_observability ( plugins = [ ] )
grpc_observability . end_open_telemetry_observability ( )
otel_plugin = grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
)
otel_plugin . register_global ( )
otel_plugin . deregister_global ( )
def testRecordUnaryUnaryWithClientInterceptor ( self ) :
interceptor = _ClientUnaryUnaryInterceptor ( )
otel_plugin = BaseTestOpenTelemetryPlugin ( self . _provider )
with grpc_observability . OpenTelemetryObservability (
plugins = [ otel_plugin ]
with grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
) :
server , port = _test_server . start_server ( )
self . _server = server
@ -236,9 +252,8 @@ class OpenTelemetryObservabilityTest(unittest.TestCase):
def testRecordUnaryUnaryWithServerInterceptor ( self ) :
interceptor = _ServerInterceptor ( )
otel_plugin = BaseTestOpenTelemetryPlugin ( self . _provider )
with grpc_observability . OpenTelemetryObservability (
plugins = [ otel_plugin ]
with grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
) :
server , port = _test_server . start_server ( interceptors = [ interceptor ] )
self . _server = server
@ -247,21 +262,12 @@ class OpenTelemetryObservabilityTest(unittest.TestCase):
self . _validate_metrics_exist ( self . all_metrics )
self . _validate_all_metrics_names ( self . all_metrics )
def testThrowErrorWhenCallingMultipleInit ( self ) :
otel_plugin = BaseTestOpenTelemetryPlugin ( self . _provider )
with self . assertRaises ( ValueError ) :
with grpc_observability . OpenTelemetryObservability (
plugins = [ otel_plugin ]
) as o11y :
grpc . _observability . observability_init ( o11y )
def testRecordUnaryUnaryClientOnly ( self ) :
server , port = _test_server . start_server ( )
self . _server = server
otel_plugin = BaseTestOpenTelemetryPlugin ( self . _provider )
with grpc_observability . OpenTelemetryObservability (
plugins = [ otel_plugin ]
with grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
) :
_test_server . unary_unary_call ( port = port )
@ -274,9 +280,8 @@ class OpenTelemetryObservabilityTest(unittest.TestCase):
self . assertEqual ( len ( self . all_metrics ) , 0 )
server . stop ( 0 )
otel_plugin = BaseTestOpenTelemetryPlugin ( self . _provider )
with grpc_observability . OpenTelemetryObservability (
plugins = [ otel_plugin ]
with grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
) :
server , port = _test_server . start_server ( )
self . _server = server
@ -286,9 +291,8 @@ class OpenTelemetryObservabilityTest(unittest.TestCase):
self . _validate_all_metrics_names ( self . all_metrics )
def testNoRecordAfterExitUseContextManager ( self ) :
otel_plugin = BaseTestOpenTelemetryPlugin ( self . _provider )
with grpc_observability . OpenTelemetryObservability (
plugins = [ otel_plugin ]
with grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
) :
server , port = _test_server . start_server ( )
self . _server = server
@ -304,16 +308,16 @@ class OpenTelemetryObservabilityTest(unittest.TestCase):
self . _validate_metrics_exist ( self . all_metrics )
def testNoRecordAfterExitUseGlobal ( self ) :
otel_plugin = BaseTestOpenTelemetryPlugin ( self . _provider )
grpc_observability . start_open_telemetry_observability (
plugins = [ otel_plugin ]
otel_plugin = grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
)
otel_plugin . register_global ( )
server , port = _test_server . start_server ( )
self . _server = server
self . _port = port
_test_server . unary_unary_call ( port = port )
grpc_observability . end_open_telemetry_observability ( )
otel_plugin . deregister_global ( )
self . _validate_metrics_exist ( self . all_metrics )
self . _validate_all_metrics_names ( self . all_metrics )
@ -324,10 +328,8 @@ class OpenTelemetryObservabilityTest(unittest.TestCase):
self . _validate_metrics_exist ( self . all_metrics )
def testRecordUnaryStream ( self ) :
otel_plugin = BaseTestOpenTelemetryPlugin ( self . _provider )
with grpc_observability . OpenTelemetryObservability (
plugins = [ otel_plugin ]
with grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
) :
server , port = _test_server . start_server ( )
self . _server = server
@ -337,10 +339,8 @@ class OpenTelemetryObservabilityTest(unittest.TestCase):
self . _validate_all_metrics_names ( self . all_metrics )
def testRecordStreamUnary ( self ) :
otel_plugin = BaseTestOpenTelemetryPlugin ( self . _provider )
with grpc_observability . OpenTelemetryObservability (
plugins = [ otel_plugin ]
with grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
) :
server , port = _test_server . start_server ( )
self . _server = server
@ -350,10 +350,8 @@ class OpenTelemetryObservabilityTest(unittest.TestCase):
self . _validate_all_metrics_names ( self . all_metrics )
def testRecordStreamStream ( self ) :
otel_plugin = BaseTestOpenTelemetryPlugin ( self . _provider )
with grpc_observability . OpenTelemetryObservability (
plugins = [ otel_plugin ]
with grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider
) :
server , port = _test_server . start_server ( )
self . _server = server
@ -374,11 +372,8 @@ class OpenTelemetryObservabilityTest(unittest.TestCase):
return False
return True
otel_plugin = BaseTestOpenTelemetryPlugin ( self . _provider )
otel_plugin . target_attribute_filter = target_filter
with grpc_observability . OpenTelemetryObservability (
plugins = [ otel_plugin ]
with grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider , target_attribute_filter = target_filter
) :
_test_server . unary_unary_call ( port = main_port )
_test_server . unary_unary_call ( port = backup_port )
@ -406,11 +401,9 @@ class OpenTelemetryObservabilityTest(unittest.TestCase):
return False
return True
otel_plugin = BaseTestOpenTelemetryPlugin ( self . _provider )
otel_plugin . generic_method_attribute_filter = method_filter
with grpc_observability . OpenTelemetryObservability (
plugins = [ otel_plugin ]
with grpc_observability . OpenTelemetryPlugin (
meter_provider = self . _provider ,
generic_method_attribute_filter = method_filter ,
) :
server , port = _test_server . start_server ( )
self . _server = server