Skip to content

Commit 673e4aa

Browse files
Record exception in Celery instrumentation (#1573)
* Add tests for errors in Celery tasks I noticed there were no tests for the error scenario in the Celery package. This commit adds a basic test, based on the previous test and how I see other packages test the error status on the span. Part of #987 * Record exception in Celery instrumentation In addition to setting the status on the span, also record the exception on the span. This adds an event to the span with more details about the error, following the format other instrumentations also use. * Update CHANGELOG with Celery record exception * Fix lint code formatting issues * Move Celery error tests to the functional tests The celery tests failed on Python 3.11. This is most likely due to this issue in billiard, a celery dependency, about it not working on Python 3.11 because of the error reported in the CI: celery/billiard#377 It's been fixed in billiard 4.1.0, but celery is locked on billiard version lower than 4, so it cannot use this version with the fix. This issue does not arise on the Docker tests, because they use Python 3.9.16. I've moved the error test span event assertions to the error test that is available in the functional tests, and removed the unit test. That way, the build will run successfully. * Remove duplicate entry in changelog This was added in a recent merge commit on this PR branch. * Remove unused test code With the move of the tests for tasks with errors to the functional tests, remove the unit test's error task and unused imports. --------- Co-authored-by: Srikanth Chekuri <[email protected]>
1 parent 520e58d commit 673e4aa

File tree

3 files changed

+9
-0
lines changed

3 files changed

+9
-0
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
### Added
1111

12+
- `opentelemetry-instrumentation-celery` Record exceptions as events on the span.
13+
([#1573](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1573))
1214
- Add metric instrumentation for urllib
1315
([#1553](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1553))
1416
- `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

instrumentation/opentelemetry-instrumentation-celery/src/opentelemetry/instrumentation/celery/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ def _trace_failure(*args, **kwargs):
250250

251251
if ex is not None:
252252
status_kwargs["description"] = str(ex)
253+
span.record_exception(ex)
253254
span.set_status(Status(**status_kwargs))
254255

255256
@staticmethod

tests/opentelemetry-docker-tests/tests/celery/test_celery_functional.py

+6
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ def fn_task_parameters(user, force_logout=False):
249249
run_span.attributes.get("celery.task_name")
250250
== "test_celery_functional.fn_task_parameters"
251251
)
252+
assert len(run_span.events) == 0
252253

253254

254255
def test_fn_exception(celery_app, memory_exporter):
@@ -275,6 +276,11 @@ def fn_exception():
275276
== "test_celery_functional.fn_exception"
276277
)
277278
assert span.status.status_code == StatusCode.ERROR
279+
assert len(span.events) == 1
280+
event = span.events[0]
281+
assert event.name == "exception"
282+
assert event.attributes[SpanAttributes.EXCEPTION_TYPE] == "ExceptionInfo"
283+
assert SpanAttributes.EXCEPTION_MESSAGE in event.attributes
278284
assert (
279285
span.attributes.get(SpanAttributes.MESSAGING_MESSAGE_ID)
280286
== result.task_id

0 commit comments

Comments
 (0)