Skip to content

Commit bf11d7f

Browse files
committed
clean up validation app workflow and move lambda env check
1 parent 94cf9ce commit bf11d7f

File tree

4 files changed

+84
-134
lines changed

4 files changed

+84
-134
lines changed

.github/workflows/release-udp-exporter.yml

Lines changed: 32 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -22,93 +22,60 @@ jobs:
2222
- name: Install dependencies
2323
run: |
2424
python -m pip install --upgrade pip
25-
pip install hatch pytest
25+
pip install hatch pytest flask
2626
2727
- name: Build package
2828
working-directory: exporters/aws-otel-otlp-udp-exporter
2929
run: hatch build
3030

31-
- name: Setup X-Ray daemon
31+
- name: Download and run X-Ray Daemon
3232
run: |
33-
# Download X-Ray daemon
34-
wget https://s3.us-east-2.amazonaws.com/aws-xray-assets.us-east-2/xray-daemon/aws-xray-daemon-linux-3.x.zip
35-
unzip -o aws-xray-daemon-linux-3.x.zip
36-
37-
# Create config file
38-
echo '{
39-
"Version": 2,
40-
"TotalBufferSizeMB": 10,
41-
"Logging": {
42-
"LogLevel": "debug"
43-
},
44-
}' > xray-daemon-config.json
33+
mkdir xray-daemon
34+
cd xray-daemon
35+
wget https://s3.us-west-2.amazonaws.com/aws-xray-assets.us-west-2/xray-daemon/aws-xray-daemon-linux-3.x.zip
36+
unzip aws-xray-daemon-linux-3.x.zip
37+
./xray -o -n us-west-2 -f ./daemon-logs.log --log-level debug &
4538
46-
# Make sure xray is executable
47-
chmod +x ./xray
48-
49-
# Create logs directory
50-
mkdir -p daemon-logs
51-
52-
# Start X-Ray daemon
53-
./xray -o -n us-west-2 -c xray-daemon-config.json > daemon-logs/xray-daemon.log 2>&1 &
54-
XRAY_PID=$!
55-
echo "X-Ray daemon started with PID $XRAY_PID"
56-
57-
# Wait for daemon to be ready
58-
echo "Waiting for X-Ray daemon to start..."
39+
- name: Install UDP Exporter
40+
run: |
41+
pip install ./exporters/aws-otel-otlp-udp-exporter/dist/*.whl
42+
43+
- name: Ensure Unit Tests are passing
44+
run: |
45+
pytest exporters/aws-otel-otlp-udp-exporter/tests/test_exporter.py
46+
47+
- name: Run Sample App in Background
48+
working-directory: sample-applications/integ-test-app
49+
run: |
50+
# Start validation app
51+
python udp_exporter_validation_app.py &
52+
# Wait for validation app to initialize
5953
sleep 5
60-
61-
# Check if process is still running
62-
if ps -p $XRAY_PID > /dev/null; then
63-
echo "✅ X-Ray daemon process is running"
64-
else
65-
echo "❌ X-Ray daemon process is not running"
66-
echo "Log contents:"
67-
cat daemon-logs/xray-daemon.log
68-
exit 1
69-
fi
70-
71-
# Try to connect to the daemon
72-
if nc -zv 127.0.0.1 2000 2>&1; then
73-
echo "✅ Successfully connected to X-Ray daemon on port 2000"
74-
else
75-
echo "❌ Cannot connect to X-Ray daemon on port 2000"
76-
echo "Log contents:"
77-
cat daemon-logs/xray-daemon.log
78-
exit 1
79-
fi
80-
81-
# Extra verification with curl (might not work depending on daemon setup)
82-
if curl -s http://localhost:2000/GetDaemonVersion; then
83-
echo "✅ X-Ray daemon API responded"
84-
else
85-
echo "ℹ️ X-Ray daemon doesn't support API or not ready yet"
86-
# Don't exit with error as this might not be reliable
87-
fi
88-
89-
echo "X-Ray daemon setup completed"
9054
91-
- name: Setup validation app
55+
- name: Call Sample App Endpoint
9256
run: |
93-
pip install ./exporters/aws-otel-otlp-udp-exporter/dist/*.whl
57+
echo "traceId=$(curl localhost:8080/test)" >> $GITHUB_OUTPUT
9458
95-
- name: Run validation test
96-
working-directory: exporters/aws-otel-otlp-udp-exporter/validation-app
97-
run: python app.py
59+
- name: Print Daemon Logs
60+
run: |
61+
sleep 20
62+
cat xray-daemon/daemon-logs.log
9863
9964
- name: Verify X-Ray daemon received traces
10065
run: |
10166
echo "X-Ray daemon logs:"
102-
cat daemon-logs/xray-daemon.log
67+
cat xray-daemon/daemon-logs.log
10368
10469
# Check if the daemon received and processed some data
105-
if grep -q "sending.*batch" daemon-logs/xray-daemon.log; then
70+
if grep -q "sending.*batch" xray-daemon/daemon-logs.log; then
10671
echo "✅ X-Ray daemon processed trace data (AWS upload errors are expected)"
10772
exit 0
108-
elif grep -q "processor:.*segment" daemon-logs/xray-daemon.log; then
73+
elif grep -q "processor:.*segment" xray-daemon/daemon-logs.log; then
10974
echo "✅ X-Ray daemon processed segment data (AWS upload errors are expected)"
11075
exit 0
11176
else
11277
echo "❌ No evidence of traces being received by X-Ray daemon"
11378
exit 1
11479
fi
80+
81+
# TODO: Steps to publish to PyPI

exporters/aws-otel-otlp-udp-exporter/src/amazon/opentelemetry/exporters/otlp/udp/exporter.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,6 @@
2323

2424
class UdpExporter:
2525
def __init__(self, endpoint: Optional[str] = None):
26-
if endpoint is None and "AWS_LAMBDA_FUNCTION_NAME" in os.environ:
27-
# If in an AWS Lambda Environment, `AWS_XRAY_DAEMON_ADDRESS` will be defined
28-
endpoint = os.environ.get("AWS_XRAY_DAEMON_ADDRESS", DEFAULT_ENDPOINT)
29-
3026
self._endpoint = endpoint or DEFAULT_ENDPOINT
3127
self._host, self._port = self._parse_endpoint(self._endpoint)
3228
self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
@@ -61,6 +57,10 @@ def _parse_endpoint(self, endpoint: str) -> Tuple[str, int]:
6157

6258
class OTLPUdpSpanExporter(SpanExporter):
6359
def __init__(self, endpoint: Optional[str] = None, sampled: bool = True):
60+
if endpoint is None and "AWS_LAMBDA_FUNCTION_NAME" in os.environ:
61+
# If in an AWS Lambda Environment, `AWS_XRAY_DAEMON_ADDRESS` will be defined
62+
endpoint = os.environ.get("AWS_XRAY_DAEMON_ADDRESS", DEFAULT_ENDPOINT)
63+
6464
self._udp_exporter = UdpExporter(endpoint=endpoint)
6565
self._sampled = sampled
6666

exporters/aws-otel-otlp-udp-exporter/validation-app/app.py

Lines changed: 0 additions & 65 deletions
This file was deleted.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
from flask import Flask, jsonify
2+
3+
from amazon.opentelemetry.exporters.otlp.udp import OTLPUdpSpanExporter
4+
from opentelemetry import trace
5+
from opentelemetry.sdk.trace import TracerProvider
6+
from opentelemetry.sdk.trace.export import BatchSpanProcessor
7+
8+
app = Flask(__name__)
9+
10+
# Set up tracer provider
11+
tracer_provider = TracerProvider()
12+
trace.set_tracer_provider(tracer_provider)
13+
14+
# Set up UDP exporter with batch processor
15+
exporter = OTLPUdpSpanExporter(endpoint="127.0.0.1:2000")
16+
span_processor = BatchSpanProcessor(exporter)
17+
tracer_provider.add_span_processor(span_processor)
18+
19+
# Get tracer
20+
tracer = trace.get_tracer(__name__)
21+
22+
23+
@app.route("/test", methods=["GET"])
24+
def create_trace():
25+
# Create a span for testing with various attributes
26+
tracer = trace.get_tracer(__name__)
27+
with tracer.start_as_current_span("test_parent_span") as parent:
28+
parent.set_attribute("service.name", "validation-app")
29+
parent.set_attribute("test.attribute", "test_value")
30+
parent.add_event("test-event", {"event.data": "some data"})
31+
32+
# Get the trace ID
33+
trace_id = format(parent.get_span_context().trace_id, "032x")
34+
35+
# Add a child span
36+
with tracer.start_as_current_span("test_child_span") as child:
37+
child.set_attribute("child.attribute", "child_value")
38+
print("Created spans with attributes and events")
39+
40+
# Force flush to ensure spans are exported immediately
41+
success = tracer_provider.force_flush()
42+
print(f"Force flush {'succeeded' if success else 'failed'}")
43+
44+
return jsonify({"trace_id": trace_id})
45+
46+
47+
if __name__ == "__main__":
48+
app.run(port=8080)

0 commit comments

Comments
 (0)