Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion src/instana/agent/serverless.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ def _prepare_payload(self, payload: dict[str, Any]) -> dict[str, Any]:
Returns:
Modified payload with filtered spans
"""
spans = payload.get("spans", [])
spans = payload.get("spans") or []
filtered_spans = self.filter_spans(spans)

if len(filtered_spans) > 0:
Expand Down
4 changes: 2 additions & 2 deletions src/instana/collector/aws_lambda.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ def should_send_snapshot_data(self):

def prepare_payload(self):
payload = DictionaryOfStan()
payload["spans"] = None
payload["metrics"] = None
payload["spans"] = []
payload["metrics"]["plugins"] = []

if not self.span_queue.empty():
payload["spans"] = format_span(self.queued_spans())
Expand Down
12 changes: 12 additions & 0 deletions tests/agent/test_serverless_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,18 @@ def test_prepare_payload_with_no_spans(self) -> None:
assert "metrics" in result
assert "spans" not in result or len(result.get("spans", [])) == 0

def test_prepare_payload_with_none_spans(self) -> None:
"""Test payload preparation when spans are explicitly None."""
agent = ConcreteServerlessAgent()

payload = {"spans": None, "metrics": {"test": "data"}}

result = agent._prepare_payload(payload)

assert "metrics" in result
# Should handle None spans without raising a TypeError
assert result["spans"] is None

def test_build_headers(self) -> None:
"""Test that headers are built correctly."""
agent = ConcreteServerlessAgent()
Expand Down
70 changes: 70 additions & 0 deletions tests/collector/test_aws_lambda_collector.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# (c) Copyright IBM Corp. 2026

"""
Unit tests for AWSLambdaCollector.
This test suite validates the payload preparation and metric reporting
for the AWS Lambda instrumentation collector.
"""

from collections import defaultdict
from typing import Generator
from unittest.mock import MagicMock, patch

import pytest

from instana.collector.aws_lambda import AWSLambdaCollector


class TestAWSLambdaCollector:
"""Test suite for AWSLambdaCollector base class."""

@pytest.fixture(autouse=True)
def _resource(
self,
caplog: pytest.LogCaptureFixture,
) -> Generator[None, None, None]:

self.agent = MagicMock()
self.collector = AWSLambdaCollector(self.agent)
yield

def test_prepare_payload_empty_span_queue(self) -> None:
"""Test that prepare_payload returns an empty list for spans when queue is empty."""
payload = self.collector.prepare_payload()

assert isinstance(payload, defaultdict)

assert "spans" in payload
assert payload["spans"] == []

assert "metrics" in payload
assert "plugins" in payload["metrics"]

def test_prepare_payload_with_spans(self) -> None:
"""Test that prepare_payload formats queued spans and includes them in the payload."""
mock_span = MagicMock()
self.collector.span_queue.put(mock_span)

# Mock queued_spans and format_span
self.collector.queued_spans = MagicMock(return_value=[mock_span])

with patch("instana.collector.aws_lambda.format_span") as mock_format:
mock_format.return_value = [{"n": "test_span"}]
payload = self.collector.prepare_payload()

assert payload["spans"] == [{"n": "test_span"}]
assert payload["metrics"]["plugins"] == []

def test_prepare_payload_with_snapshot_data(self) -> None:
"""Test that prepare_payload includes snapshot data when it should be sent."""
self.collector.snapshot_data = {
"plugins": [{"name": "com.instana.plugin.aws.lambda"}]
}
self.collector.snapshot_data_sent = False

payload = self.collector.prepare_payload()

assert payload["metrics"] == {
"plugins": [{"name": "com.instana.plugin.aws.lambda"}]
}
assert self.collector.snapshot_data_sent is True
Loading