Skip to content

Commit 7804083

Browse files
imanshafiei540srikanthccvshalevr
authored
Fix Invalid type NoneType for attribute X error | AWS-Lambda instrumentation (#1785)
* Add None checking to the aws-lambda logic * Update changelog. * Change .get() check to 'key' in dict check. * Fix consistency issues. * Update changelog. --------- Co-authored-by: Srikanth Chekuri <srikanth.chekuri92@gmail.com> Co-authored-by: Shalev Roda <65566801+shalevr@users.noreply.github.com>
1 parent a3a0b24 commit 7804083

File tree

2 files changed

+53
-43
lines changed
  • instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda

2 files changed

+53
-43
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1414
- Fix falcon instrumentation's usage of Span Status to only set the description if the status code is ERROR.
1515
([#1840](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1840))
1616
- Instrument all httpx versions >= 0.18. ([#1748](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1748))
17+
- Fix `Invalid type NoneType for attribute X (opentelemetry-instrumentation-aws-lambda)` error when some attributes do not exist
18+
([#1780](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1780))
1719

1820
## Version 1.18.0/0.39b0 (2023-05-10)
1921

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

+51-43
Original file line numberDiff line numberDiff line change
@@ -201,30 +201,35 @@ def _set_api_gateway_v1_proxy_attributes(
201201
span.set_attribute(
202202
SpanAttributes.HTTP_METHOD, lambda_event.get("httpMethod")
203203
)
204-
span.set_attribute(SpanAttributes.HTTP_ROUTE, lambda_event.get("resource"))
205204

206205
if lambda_event.get("headers"):
207-
span.set_attribute(
208-
SpanAttributes.HTTP_USER_AGENT,
209-
lambda_event["headers"].get("User-Agent"),
210-
)
211-
span.set_attribute(
212-
SpanAttributes.HTTP_SCHEME,
213-
lambda_event["headers"].get("X-Forwarded-Proto"),
214-
)
215-
span.set_attribute(
216-
SpanAttributes.NET_HOST_NAME, lambda_event["headers"].get("Host")
217-
)
206+
if "User-Agent" in lambda_event["headers"]:
207+
span.set_attribute(
208+
SpanAttributes.HTTP_USER_AGENT,
209+
lambda_event["headers"]["User-Agent"],
210+
)
211+
if "X-Forwarded-Proto" in lambda_event["headers"]:
212+
span.set_attribute(
213+
SpanAttributes.HTTP_SCHEME,
214+
lambda_event["headers"]["X-Forwarded-Proto"],
215+
)
216+
if "Host" in lambda_event["headers"]:
217+
span.set_attribute(
218+
SpanAttributes.NET_HOST_NAME,
219+
lambda_event["headers"]["Host"],
220+
)
221+
if "resource" in lambda_event:
222+
span.set_attribute(SpanAttributes.HTTP_ROUTE, lambda_event["resource"])
218223

219-
if lambda_event.get("queryStringParameters"):
220-
span.set_attribute(
221-
SpanAttributes.HTTP_TARGET,
222-
f"{lambda_event.get('resource')}?{urlencode(lambda_event.get('queryStringParameters'))}",
223-
)
224-
else:
225-
span.set_attribute(
226-
SpanAttributes.HTTP_TARGET, lambda_event.get("resource")
227-
)
224+
if lambda_event.get("queryStringParameters"):
225+
span.set_attribute(
226+
SpanAttributes.HTTP_TARGET,
227+
f"{lambda_event['resource']}?{urlencode(lambda_event['queryStringParameters'])}",
228+
)
229+
else:
230+
span.set_attribute(
231+
SpanAttributes.HTTP_TARGET, lambda_event["resource"]
232+
)
228233

229234
return span
230235

@@ -237,35 +242,38 @@ def _set_api_gateway_v2_proxy_attributes(
237242
More info:
238243
https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html
239244
"""
240-
span.set_attribute(
241-
SpanAttributes.NET_HOST_NAME,
242-
lambda_event["requestContext"].get("domainName"),
243-
)
244-
245-
if lambda_event["requestContext"].get("http"):
245+
if "domainName" in lambda_event["requestContext"]:
246246
span.set_attribute(
247-
SpanAttributes.HTTP_METHOD,
248-
lambda_event["requestContext"]["http"].get("method"),
249-
)
250-
span.set_attribute(
251-
SpanAttributes.HTTP_USER_AGENT,
252-
lambda_event["requestContext"]["http"].get("userAgent"),
253-
)
254-
span.set_attribute(
255-
SpanAttributes.HTTP_ROUTE,
256-
lambda_event["requestContext"]["http"].get("path"),
247+
SpanAttributes.NET_HOST_NAME,
248+
lambda_event["requestContext"]["domainName"],
257249
)
258250

259-
if lambda_event.get("rawQueryString"):
251+
if lambda_event["requestContext"].get("http"):
252+
if "method" in lambda_event["requestContext"]["http"]:
260253
span.set_attribute(
261-
SpanAttributes.HTTP_TARGET,
262-
f"{lambda_event['requestContext']['http'].get('path')}?{lambda_event.get('rawQueryString')}",
254+
SpanAttributes.HTTP_METHOD,
255+
lambda_event["requestContext"]["http"]["method"],
263256
)
264-
else:
257+
if "userAgent" in lambda_event["requestContext"]["http"]:
265258
span.set_attribute(
266-
SpanAttributes.HTTP_TARGET,
267-
lambda_event["requestContext"]["http"].get("path"),
259+
SpanAttributes.HTTP_USER_AGENT,
260+
lambda_event["requestContext"]["http"]["userAgent"],
261+
)
262+
if "path" in lambda_event["requestContext"]["http"]:
263+
span.set_attribute(
264+
SpanAttributes.HTTP_ROUTE,
265+
lambda_event["requestContext"]["http"]["path"],
268266
)
267+
if lambda_event.get("rawQueryString"):
268+
span.set_attribute(
269+
SpanAttributes.HTTP_TARGET,
270+
f"{lambda_event['requestContext']['http']['path']}?{lambda_event['rawQueryString']}",
271+
)
272+
else:
273+
span.set_attribute(
274+
SpanAttributes.HTTP_TARGET,
275+
lambda_event["requestContext"]["http"]["path"],
276+
)
269277

270278
return span
271279

0 commit comments

Comments
 (0)