Skip to content

feat(metrics): support to bring your own metrics provider #2194

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 54 commits into from
Aug 1, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
b9f8cea
Use a different Metric class for different provider
roger-zhangg May 30, 2023
06c9c8e
fix static checking error
roger-zhangg May 30, 2023
10514f7
fix static checking error
roger-zhangg May 30, 2023
c9b018f
optimize docstring
roger-zhangg Jun 1, 2023
de7eb16
Merge branch 'awslabs:develop' into metrics
roger-zhangg Jun 5, 2023
efab535
Merge remote-tracking branch 'upstream/develop' into metrics
roger-zhangg Jun 6, 2023
5fd493a
Merge branch 'develop' into develop
roger-zhangg Jun 6, 2023
8dde509
Merge remote-tracking branch 'upstream/develop' into metrics
roger-zhangg Jun 12, 2023
58bc274
add alias CloudWatchEMF to original Metrics class
roger-zhangg Jun 12, 2023
4de8842
add alias CloudWatchEMF to original Metrics class
roger-zhangg Jun 12, 2023
ea4ec06
Merge remote-tracking branch 'origin/develop' into develop
roger-zhangg Jun 12, 2023
dafed9e
Merge branch 'develop' into develop
leandrodamascena Jun 13, 2023
fedb3a0
Move Metrics to Provider
roger-zhangg Jun 13, 2023
3bab2ae
Merge remote-tracking branch 'origin/develop' into develop
roger-zhangg Jun 13, 2023
169f02c
add sample document
roger-zhangg Jun 15, 2023
7bfd874
reformat code block
roger-zhangg Jun 15, 2023
f26e26d
add OTel provider draft for poc
roger-zhangg Jun 20, 2023
e015351
Merge branch 'develop' into develop
leandrodamascena Jun 27, 2023
5659cdd
rebasing from upstream
leandrodamascena Jun 27, 2023
1dab8d1
rebasing from upstream
leandrodamascena Jun 27, 2023
c203c3d
add test to metrics providers
roger-zhangg Jun 28, 2023
3045abc
merging from develop
leandrodamascena Jul 11, 2023
9cde8e3
docstring + code coverage
leandrodamascena Jul 11, 2023
5bdb2c2
python annotations + imports
leandrodamascena Jul 11, 2023
ab36099
changing the name to AmazonCloudWatchEMF
leandrodamascena Jul 12, 2023
4ee1b9e
Merge branch 'develop' into develop
leandrodamascena Jul 12, 2023
28531ac
Merge branch 'develop' into develop
leandrodamascena Jul 13, 2023
c223e65
Merge branch 'develop' into develop
leandrodamascena Jul 13, 2023
3673c4b
fix docstring
roger-zhangg Jul 13, 2023
93ba2bc
Merge remote-tracking branch 'origin/develop' into develop
roger-zhangg Jul 13, 2023
5c49b1e
add tests for datadog provider
roger-zhangg Jul 13, 2023
1540be7
add tests for datadog provider
roger-zhangg Jul 13, 2023
1f949aa
Merge branch 'develop' into develop
leandrodamascena Jul 19, 2023
190b112
Merge branch 'develop' into develop
leandrodamascena Jul 21, 2023
01972e5
migrate from ABC to protocol, support convert kwargs to tags, add test
roger-zhangg Jul 24, 2023
c31d41f
migrate from ABC to protocol, support convert kwargs to tags, add test
roger-zhangg Jul 24, 2023
3bebcad
migrate from ABC to protocol, support convert kwargs to tags, add test
roger-zhangg Jul 24, 2023
e7c1443
remove parent class, fix example
roger-zhangg Jul 25, 2023
7556782
Merge branch 'develop' into develop
leandrodamascena Jul 25, 2023
a904764
base: fix small problems
leandrodamascena Jul 27, 2023
58a25fb
refactoring: removing Datadog provider
leandrodamascena Jul 27, 2023
00e719d
Merge branch 'develop' into develop
leandrodamascena Jul 27, 2023
bdaa736
refactoring: importing from typing_extensions
leandrodamascena Jul 27, 2023
7ac42be
refactoring EMF provider
leandrodamascena Jul 27, 2023
294bd85
refactoring cloudwatchemf provider and cleaning code
leandrodamascena Jul 28, 2023
077d7e7
fix mypy error
leandrodamascena Jul 28, 2023
ae67adb
Merge remote-tracking branch 'upstream/develop' into roger-zhangg/dev…
leandrodamascena Jul 28, 2023
42517ed
fix mypy error
leandrodamascena Jul 28, 2023
28982a3
fix metric tests
leandrodamascena Jul 28, 2023
f798ab8
Merge branch 'develop' into develop
leandrodamascena Jul 28, 2023
7fe0641
Merge branch 'develop' into develop
leandrodamascena Jul 28, 2023
4592939
removing documentation
Aug 1, 2023
e8cfc81
fix documentation
Aug 1, 2023
92eda07
adding test
Aug 1, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
docstring + code coverage
  • Loading branch information
leandrodamascena committed Jul 11, 2023
commit 9cde8e3c9cdc3603ad05110f204e4e92f1fade3f
121 changes: 110 additions & 11 deletions aws_lambda_powertools/metrics/provider/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,42 +9,141 @@


class MetricsProviderBase(ABC):
"""Class for metric provider template
"""
Class for metric provider template.

Use this template to create your own metric provider.
This class serves as a template for creating your own metric provider. Inherit from this class
and implement the required methods to define your specific metric provider.

Usage:
1. Inherit from this class.
2. Implement the required methods specific to your metric provider.
3. Customize the behavior and functionality of the metric provider in your subclass.
"""

# General add metric function. Should return combined metrics Dict
@abstractmethod
def add_metric(self, *args, **kwargs):
pass
"""
Abstract method for adding a metric.

This method must be implemented in subclasses to add a metric and return a combined metrics dictionary.

Parameters
----------
*args:
Positional arguments.
*kwargs:
Keyword arguments.

Returns
----------
Dict
A combined metrics dictionary.

Raises
----------
NotImplementedError
This method must be implemented in subclasses.
"""
raise NotImplementedError

# serialize and return dict for flushing
@abstractmethod
def serialize(self, *args, **kwargs):
pass
"""
Abstract method for serialize a metric.

This method must be implemented in subclasses to add a metric and return a combined metrics dictionary.

Parameters
----------
*args:
Positional arguments.
*kwargs:
Keyword arguments.

Returns
----------
Dict
Serialized metrics

Raises
----------
NotImplementedError
This method must be implemented in subclasses.
"""
raise NotImplementedError

# flush serialized data to output, or send to API directly
@abstractmethod
def flush(self, *args, **kwargs):
pass
"""
Abstract method for flushing a metric.

This method must be implemented in subclasses to add a metric and return a combined metrics dictionary.

Parameters
----------
*args:
Positional arguments.
*kwargs:
Keyword arguments.

Raises
----------
NotImplementedError
This method must be implemented in subclasses.
"""
raise NotImplementedError


class MetricsBase(ABC):
"""Class for metric template
"""
Class for metric template.

Use this template to create your own metric class.
This class serves as a template for creating your own metric class. Inherit from this class
and implement the necessary methods to define your specific metric.

NOTE: need to improve this docstring
"""

@abstractmethod
def add_metric(self, *args, **kwargs):
pass
"""
Abstract method for adding a metric.

This method must be implemented in subclasses to add a metric and return a combined metrics dictionary.

Parameters
----------
*args:
Positional arguments.
*kwargs:
Keyword arguments.

Returns
----------
Dict
A combined metrics dictionary.

Raises
----------
NotImplementedError
This method must be implemented in subclasses.
"""
raise NotImplementedError

@abstractmethod
def flush_metrics(self, raise_on_empty_metrics: bool = False) -> None:
pass
"""Manually flushes the metrics. This is normally not necessary,
unless you're running on other runtimes besides Lambda, where the @log_metrics
decorator already handles things for you.

Parameters
----------
raise_on_empty_metrics : bool, optional
raise exception if no metrics are emitted, by default False
"""
raise NotImplementedError

def log_metrics(
self,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ class OTLPMetrics(MetricsBase):

Example
-------
dd_provider = DataDogProvider(namespace="default")
metrics = DataDogMetrics(provider=dd_provider)
dd_provider = OTLPProvider(namespace="default")
metrics = OTLPMetrics(provider=dd_provider)

@metrics.log_metrics(capture_cold_start_metric: bool = True, raise_on_empty_metrics: bool = False)
def lambda_handler(event, context)
Expand Down
6 changes: 3 additions & 3 deletions aws_lambda_powertools/shared/user_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ def register_feature_to_session(session, feature):
def register_feature_to_botocore_session(botocore_session, feature):
"""
Register the given feature string to the event system of the provided botocore session

Please notice this function is for patching botocore session and is different from
previous one which is for patching boto3 session

Expand All @@ -127,7 +127,7 @@ def register_feature_to_botocore_session(botocore_session, feature):
------
AttributeError
If the provided session does not have an event system.

Examples
--------
**register data-masking user-agent to botocore session**
Expand All @@ -139,7 +139,7 @@ def register_feature_to_botocore_session(botocore_session, feature):
>>> session = botocore.session.Session()
>>> register_feature_to_botocore_session(botocore_session=session, feature="data-masking")
>>> key_provider = StrictAwsKmsMasterKeyProvider(key_ids=self.keys, botocore_session=session)

"""
try:
botocore_session.register(TARGET_SDK_EVENT, _create_feature_function(feature))
Expand Down