-
Notifications
You must be signed in to change notification settings - Fork 388
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
[Logs forwarder] Parse enhanced metrics from Lambda telemetry JSON logs. #859
Conversation
These get emitted instead of regular REPORT logs if log format is set to JSON.
a51e969
to
b73dc0d
Compare
MEMORY_ALLOCATED_RECORD_KEY = "memorySizeMB" | ||
INIT_DURATION_RECORD_KEY = "initDurationMs" | ||
BILLED_DURATION_RECORD_KEY = "billedDurationMs" | ||
RUNTIME_METRICS_BY_RECORD_KEY = { | ||
# Except INIT_DURATION_RECORD_KEY which is handled separately | ||
"durationMs": DURATION_METRIC_NAME, | ||
BILLED_DURATION_RECORD_KEY: BILLED_DURATION_METRIC_NAME, | ||
"maxMemoryUsedMB": MAX_MEMORY_USED_METRIC_NAME, | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: could you move these to the top of the file.
nit: let's put dureationMs
and maxMemeoryUsedMB
as keys as well
if not log_message.startswith("{"): | ||
return [] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: no need for this here, we can return at the try/except of parsing json fails
) | ||
) | ||
|
||
if record["status"] == "timeout": |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if record["status"] == "timeout": | |
if record.get("status") == "timeout": |
f"{MEMORY_ALLOCATED_FIELD_NAME}:{record_metrics[MEMORY_ALLOCATED_RECORD_KEY]}" | ||
] | ||
|
||
try: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
to have less try/except patterns
try: | |
init_duration = record_metrics.get(INIT_DURATION_RECORD_KEY) | |
if init_duration: | |
tags.append("cold_start:true") | |
metrics.append( | |
DatadogMetricPoint( | |
f"{ENHANCED_METRICS_NAMESPACE_PREFIX}.{INIT_DURATION_METRIC_NAME}", | |
init_duration * METRIC_ADJUSTMENT_FACTORS[INIT_DURATION_METRIC_NAME], | |
) | |
) | |
else: | |
tags.append("cold_start:false") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hm, for some reason, suggestion code doesn't have removed lines I'd expected it to have. I'll apply this change with the rest in one commit.
* Less try/catch * Organize constants * Remove unnecessary defensive JSON check
What does this PR do?
This change makes forwarder parse enhanced metrics from Lambda telemetry logs which get emitted instead of regular REPORT ones when JSON format is enabled. For schema, see https://docs.aws.amazon.com/lambda/latest/dg/telemetry-schema-reference.html#platform-report
Motivation
I would like to see same basic enhanced metrics I see when Lambda uses plain text logging when I enable JSON logging option.
Testing Guidelines
tests/run_unit_tests.sh
LOG_FORMAT=JSON
envar set and confirmed enhanced telemetry is showing upAdditional Notes
cold_start
tag is set for REPORT logs but for some reason neither show up in our DD instanceTypes of changes
Check all that apply