Skip to main content

OpenTelemetry metrics exporter for AWS CloudWatch using Embedded Metric Format (EMF)

Reason this release was yanked:

Superseded by 0.2.5, the current stable release with cleaned documentation and QA fixes.

Project description

OpenTelemetry CloudWatch EMF Exporter

PyPI Python Versions License

An OpenTelemetry metrics exporter for AWS CloudWatch using Embedded Metric Format (EMF).

This is an unofficial community project. It is not affiliated with, endorsed by, or maintained by Amazon Web Services (AWS), Amazon CloudWatch, or the OpenTelemetry project.

Architecture Overview

┌─────────────────────────────────────────────────────────────────────────────┐
│                            Your Application                                  │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   ┌─────────────┐     ┌─────────────┐     ┌─────────────┐                  │
│   │   Counter   │     │    Gauge    │     │  Histogram  │                  │
│   └──────┬──────┘     └──────┬──────┘     └──────┬──────┘                  │
│          │                   │                   │                          │
│          └───────────────────┼───────────────────┘                          │
│                              ▼                                              │
│                    ┌─────────────────┐                                      │
│                    │   MeterProvider │                                      │
│                    └────────┬────────┘                                      │
│                             │                                               │
│                             ▼                                               │
│               ┌─────────────────────────┐                                   │
│               │ PeriodicExportingReader │                                   │
│               └────────────┬────────────┘                                   │
│                            │                                                │
└────────────────────────────┼────────────────────────────────────────────────┘
                             │
                             ▼
              ┌──────────────────────────────┐
              │  CloudWatchEMFExporter       │
              │  ┌────────────────────────┐  │
              │  │ • Metric Conversion    │  │
              │  │ • Unit Mapping         │  │
              │  │ • Dimension Building   │  │
              │  │ • AWS Auto-Detection   │  │
              │  │ • EMF JSON Formatting  │  │
              │  └────────────────────────┘  │
              └──────────────┬───────────────┘
                             │
                             ▼
                    ┌─────────────────┐
                    │     stdout      │
                    │  (EMF JSON)     │
                    └────────┬────────┘
                             │
        ┌────────────────────┼────────────────────┐
        │                    │                    │
        ▼                    ▼                    ▼
┌───────────────┐   ┌───────────────┐   ┌───────────────┐
│  AWS Lambda   │   │   ECS/Fargate │   │  EC2 + CW     │
│  (auto logs)  │   │  (awslogs)    │   │    Agent      │
└───────┬───────┘   └───────┬───────┘   └───────┬───────┘
        │                   │                   │
        └───────────────────┼───────────────────┘
                            │
                            ▼
                ┌───────────────────────┐
                │   CloudWatch Logs     │
                │   (EMF Processing)    │
                └───────────┬───────────┘
                            │
                            ▼
                ┌───────────────────────┐
                │  CloudWatch Metrics   │
                │  • Dashboards         │
                │  • Alarms             │
                │  • Percentiles (p99)  │
                └───────────────────────┘

Why This Exporter?

OpenTelemetry and AWS support CloudWatch EMF primarily through Collector or agent workflows. This package fills the smaller collectorless Python SDK use case: emit valid CloudWatch EMF JSON directly from a Python metrics exporter so Lambda, ECS/Fargate, and EC2 workloads can route metrics through stdout or logs.

Approach Requires Collector Cold Start Impact Complexity
ADOT Collector ✅ Yes High High
ADOT Lambda Layer ✅ Yes (embedded) Medium-High Medium
This Exporter No Minimal Low

Installation

pip install opentelemetry-exporter-cloudwatch-emf

To install a specific source release from GitHub:

pip install git+ssh://git@github.com/darrenhaas/cw-emf-exporter.git@v0.2.3

Quick Start

from opentelemetry import metrics
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
from opentelemetry_exporter_cloudwatch_emf import CloudWatchEMFExporter

# Create exporter
exporter = CloudWatchEMFExporter(namespace="MyApplication")

# Set up meter provider
reader = PeriodicExportingMetricReader(exporter, export_interval_millis=60000)
provider = MeterProvider(metric_readers=[reader])
metrics.set_meter_provider(provider)

# Create and use metrics
meter = metrics.get_meter("my-service")
counter = meter.create_counter("requests", unit="1")
counter.add(1, {"endpoint": "/api/users", "method": "GET"})

Documentation

Document Description
Architecture System design, data flow, components
Configuration All options with examples
API Reference Complete API documentation
Examples Usage patterns and recipes
Downstream Consumers Vendored consumers and review process
Release Process PyPI release checklist
Changelog Release history
0.2.2 Upgrade Notes Summary for downstream consumers
Project Notice Unofficial project and trademark notice
Community Gap Upstream context for collectorless Python EMF export

Features

Metric Types Support

OTel Metric Type EMF Output Percentile Support
Counter Single value
Gauge Single value
Histogram Values array ✅ (p50, p99, etc.)
ExponentialHistogram Values array ✅ (p50, p99, etc.)

AWS Environment Auto-Detection

┌─────────────────────────────────────────────────────────┐
│              AWS Environment Detection                   │
├─────────────────────────────────────────────────────────┤
│                                                         │
│   Check: AWS_LAMBDA_FUNCTION_NAME?                      │
│          │                                              │
│          ├── Yes ──► Lambda Environment                 │
│          │           • function_name                    │
│          │           • function_version                 │
│          │           • region                           │
│          │           • memory_size                      │
│          │                                              │
│          └── No ──► Check: ECS_CONTAINER_METADATA_URI?  │
│                     │                                   │
│                     ├── Yes ──► ECS/Fargate Environment │
│                     │           • aws_ecs=true          │
│                     │           • region                │
│                     │           • cluster/task metadata │
│                     │                                   │
│                     └── No ──► Check: AWS_REGION?       │
│                                │                        │
│                                ├── Yes ──► EC2/Generic  │
│                                │           • region     │
│                                │                        │
│                                └── No ──► No AWS attrs  │
│                                                         │
└─────────────────────────────────────────────────────────┘

Unit Mapping

OpenTelemetry (UCUM) CloudWatch Unit
s Seconds
ms Milliseconds
us Microseconds
By Bytes
KiBy Kilobytes
MiBy Megabytes
GiBy Gigabytes
TiBy Terabytes
By/s Bytes/Second
1, {request}, {error} Count
% Percent

Configuration Summary

CloudWatchEMFExporter(
    # Required
    namespace="MyApp",              # CloudWatch namespace (1-256 chars)

    # Output
    output=sys.stdout,              # Where to write EMF JSON

    # Dimensions
    dimension_keys=["svc", "env"],  # Filter dimensions (None = all)
    max_dimensions=30,              # Max dimensions (CloudWatch limit: 30)

    # Resolution
    storage_resolution=60,          # 1 = high-res, 60 = standard

    # Log Routing (for CloudWatch Agent)
    log_group_name="/aws/myapp",    # Target log group
    log_stream_name="stream-1",     # Target log stream

    # Features
    auto_detect_aws=True,           # Auto-detect Lambda/ECS/EC2
    histogram_as_values=True,       # Enable percentile calculations

    # Advanced
    timestamp_fn=lambda: int(time.time() * 1000),  # Custom timestamp
)

EMF Output Format

{
  "_aws": {
    "Timestamp": 1700000000000,
    "CloudWatchMetrics": [{
      "Namespace": "MyApplication",
      "Dimensions": [["service", "endpoint"]],
      "Metrics": [{
        "Name": "request_latency",
        "Unit": "Milliseconds",
        "StorageResolution": 60
      }]
    }]
  },
  "request_latency": [5, 5, 15, 15, 15],
  "service": "api",
  "endpoint": "/users"
}

Histogram values use bucket representatives repeated by bucket count. Large histograms are proportionally sampled to fit EMF's 100-value numeric array limit.

Development

# Install dev dependencies
uv sync --extra dev

# Run tests
uv run pytest

# Lint, type check, and package validation
uv run flake8 src tests
uv run mypy src
uv run black --check src tests
uv build
uv run twine check dist/*

License

Apache 2.0 - See LICENSE

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

File details

Details for the file opentelemetry_exporter_cloudwatch_emf-0.2.3.tar.gz.

File metadata

File hashes

Hashes for opentelemetry_exporter_cloudwatch_emf-0.2.3.tar.gz
Algorithm Hash digest
SHA256 f415d731f9d31373f6308de07fb65eef588bc02aa81577d46beb79eb8d0e61f6
MD5 18e7f1845aa68541e78422a92bb7cd50
BLAKE2b-256 513bdde92ec43da8449088d0bb28eded039c8ee93923a6c2c9d821ebd66b658b

See more details on using hashes here.

File details

Details for the file opentelemetry_exporter_cloudwatch_emf-0.2.3-py3-none-any.whl.

File metadata

File hashes

Hashes for opentelemetry_exporter_cloudwatch_emf-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 315ad70b3de08ad032923796f918fa86d58dec4e17593e187e7409025704950a
MD5 1ac2600882d2fd431033ff482b2195d6
BLAKE2b-256 131d9330fca5f23fc7c153e46384f60686252c29592027bd3b55e5a9685e285e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page