Skip to content

Commit 8c1b6dd

Browse files
committed
Flush meter provider at end of lambda function handler
Signed-off-by: Anthony J Mirabella <[email protected]>
1 parent bbe7578 commit 8c1b6dd

File tree

2 files changed

+25
-0
lines changed
  • instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda

2 files changed

+25
-0
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1313
([#1553](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1553))
1414
- `opentelemetry/sdk/extension/aws` Implement [`aws.ecs.*`](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/cloud_provider/aws/ecs.md) and [`aws.logs.*`](https://opentelemetry.io/docs/reference/specification/resource/semantic_conventions/cloud_provider/aws/logs/) resource attributes in the `AwsEcsResourceDetector` detector when the ECS Metadata v4 is available
1515
([#1212](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1212))
16+
- `opentelemetry-instrumentation-aws-lambda` Flush `MeterProvider` at end of function invocation.
17+
([#1613](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1613))
1618

1719
### Fixed
1820

instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py

+23
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ def lambda_handler(event, context):
4545
The `instrument` method accepts the following keyword args:
4646
4747
tracer_provider (TracerProvider) - an optional tracer provider
48+
meter_provider (MeterProvider) - an optional meter provider
4849
event_context_extractor (Callable) - a function that returns an OTel Trace
4950
Context given the Lambda Event the AWS Lambda was invoked with
5051
this function signature is: def event_context_extractor(lambda_event: Any) -> Context
@@ -68,6 +69,7 @@ def custom_event_context_extractor(lambda_event):
6869

6970
import logging
7071
import os
72+
import time
7173
from importlib import import_module
7274
from typing import Any, Callable, Collection
7375
from urllib.parse import urlencode
@@ -79,6 +81,10 @@ def custom_event_context_extractor(lambda_event):
7981
from opentelemetry.instrumentation.aws_lambda.version import __version__
8082
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
8183
from opentelemetry.instrumentation.utils import unwrap
84+
from opentelemetry.metrics import (
85+
MeterProvider,
86+
get_meter_provider,
87+
)
8288
from opentelemetry.propagate import get_global_textmap
8389
from opentelemetry.propagators.aws.aws_xray_propagator import (
8490
TRACE_HEADER_KEY,
@@ -274,6 +280,7 @@ def _instrument(
274280
event_context_extractor: Callable[[Any], Context],
275281
tracer_provider: TracerProvider = None,
276282
disable_aws_context_propagation: bool = False,
283+
meter_provider: MeterProvider = None,
277284
):
278285
def _instrumented_lambda_handler_call(
279286
call_wrapped, instance, args, kwargs
@@ -352,6 +359,7 @@ def _instrumented_lambda_handler_call(
352359
result.get("statusCode"),
353360
)
354361

362+
now = time.time()
355363
_tracer_provider = tracer_provider or get_tracer_provider()
356364
try:
357365
# NOTE: `force_flush` before function quit in case of Lambda freeze.
@@ -363,6 +371,19 @@ def _instrumented_lambda_handler_call(
363371
"TracerProvider was missing `force_flush` method. This is necessary in case of a Lambda freeze and would exist in the OTel SDK implementation."
364372
)
365373

374+
rem = flush_timeout - (time.time()-now)*1000
375+
if rem > 0:
376+
_meter_provider = meter_provider or get_meter_provider()
377+
try:
378+
# NOTE: `force_flush` before function quit in case of Lambda freeze.
379+
# Assumes we are using the OpenTelemetry SDK implementation of the
380+
# `MeterProvider`.
381+
_meter_provider.force_flush(rem)
382+
except Exception: # pylint: disable=broad-except
383+
logger.error(
384+
"MeterProvider was missing `force_flush` method. This is necessary in case of a Lambda freeze and would exist in the OTel SDK implementation."
385+
)
386+
366387
return result
367388

368389
wrap_function_wrapper(
@@ -385,6 +406,7 @@ def _instrument(self, **kwargs):
385406
Args:
386407
**kwargs: Optional arguments
387408
``tracer_provider``: a TracerProvider, defaults to global
409+
``meter_provider``: a MeterProvider, defaults to global
388410
``event_context_extractor``: a method which takes the Lambda
389411
Event as input and extracts an OTel Context from it. By default,
390412
the context is extracted from the HTTP headers of an API Gateway
@@ -432,6 +454,7 @@ def _instrument(self, **kwargs):
432454
),
433455
tracer_provider=kwargs.get("tracer_provider"),
434456
disable_aws_context_propagation=disable_aws_context_propagation,
457+
meter_provider=kwargs.get("meter_provider"),
435458
)
436459

437460
def _uninstrument(self, **kwargs):

0 commit comments

Comments
 (0)