Skip to content

Commit

Permalink
clean up validation app workflow and move lambda env check
Browse files Browse the repository at this point in the history
  • Loading branch information
yiyuan-he committed Mar 4, 2025
1 parent 94cf9ce commit 5f716c3
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 134 deletions.
99 changes: 34 additions & 65 deletions .github/workflows/release-udp-exporter.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,93 +22,62 @@ jobs:
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install hatch pytest
pip install hatch pytest flask
- name: Build package
working-directory: exporters/aws-otel-otlp-udp-exporter
run: hatch build

- name: Setup X-Ray daemon
- name: Download and run X-Ray Daemon
run: |
# Download X-Ray daemon
wget https://s3.us-east-2.amazonaws.com/aws-xray-assets.us-east-2/xray-daemon/aws-xray-daemon-linux-3.x.zip
unzip -o aws-xray-daemon-linux-3.x.zip
# Create config file
echo '{
"Version": 2,
"TotalBufferSizeMB": 10,
"Logging": {
"LogLevel": "debug"
},
}' > xray-daemon-config.json
mkdir xray-daemon
cd xray-daemon
wget https://s3.us-west-2.amazonaws.com/aws-xray-assets.us-west-2/xray-daemon/aws-xray-daemon-linux-3.x.zip
unzip aws-xray-daemon-linux-3.x.zip
./xray -o -n us-west-2 -f ./daemon-logs.log --log-level debug &
# Make sure xray is executable
chmod +x ./xray
# Create logs directory
mkdir -p daemon-logs
# Start X-Ray daemon
./xray -o -n us-west-2 -c xray-daemon-config.json > daemon-logs/xray-daemon.log 2>&1 &
XRAY_PID=$!
echo "X-Ray daemon started with PID $XRAY_PID"
# Wait for daemon to be ready
echo "Waiting for X-Ray daemon to start..."
- name: Install UDP Exporter
run: |
pip install ./exporters/aws-otel-otlp-udp-exporter/dist/*.whl
- name: Ensure Unit Tests are passing
run: |
pytest exporters/aws-otel-otlp-udp-exporter/tests/test_exporter.py
- name: Run Sample App in Background
working-directory: sample-applications/integ-test-app
run: |
# Start validation app
python udp_exporter_validation_app.py &
# Wait for validation app to initialize
sleep 5
# Check if process is still running
if ps -p $XRAY_PID > /dev/null; then
echo "✅ X-Ray daemon process is running"
else
echo "❌ X-Ray daemon process is not running"
echo "Log contents:"
cat daemon-logs/xray-daemon.log
exit 1
fi
# Try to connect to the daemon
if nc -zv 127.0.0.1 2000 2>&1; then
echo "✅ Successfully connected to X-Ray daemon on port 2000"
else
echo "❌ Cannot connect to X-Ray daemon on port 2000"
echo "Log contents:"
cat daemon-logs/xray-daemon.log
exit 1
fi
# Extra verification with curl (might not work depending on daemon setup)
if curl -s http://localhost:2000/GetDaemonVersion; then
echo "✅ X-Ray daemon API responded"
else
echo "ℹ️ X-Ray daemon doesn't support API or not ready yet"
# Don't exit with error as this might not be reliable
fi
echo "X-Ray daemon setup completed"
- name: Setup validation app
- name: Call Sample App Endpoint
run: |
pip install ./exporters/aws-otel-otlp-udp-exporter/dist/*.whl
# Trigger trace generation
echo "traceId=$(curl localhost:8080/test)" >> $GITHUB_OUTPUT
echo $traceId
- name: Run validation test
working-directory: exporters/aws-otel-otlp-udp-exporter/validation-app
run: python app.py
- name: Print Daemon Logs
run: |
sleep 20
cat xray-daemon/daemon-logs.log
- name: Verify X-Ray daemon received traces
run: |
echo "X-Ray daemon logs:"
cat daemon-logs/xray-daemon.log
cat xray-daemon/daemon-logs.log
# Check if the daemon received and processed some data
if grep -q "sending.*batch" daemon-logs/xray-daemon.log; then
if grep -q "sending.*batch" xray-daemon/daemon-logs.log; then
echo "✅ X-Ray daemon processed trace data (AWS upload errors are expected)"
exit 0
elif grep -q "processor:.*segment" daemon-logs/xray-daemon.log; then
elif grep -q "processor:.*segment" xray-daemon/daemon-logs.log; then
echo "✅ X-Ray daemon processed segment data (AWS upload errors are expected)"
exit 0
else
echo "❌ No evidence of traces being received by X-Ray daemon"
exit 1
fi
# TODO: Steps to publish to PyPI
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,6 @@

class UdpExporter:
def __init__(self, endpoint: Optional[str] = None):
if endpoint is None and "AWS_LAMBDA_FUNCTION_NAME" in os.environ:
# If in an AWS Lambda Environment, `AWS_XRAY_DAEMON_ADDRESS` will be defined
endpoint = os.environ.get("AWS_XRAY_DAEMON_ADDRESS", DEFAULT_ENDPOINT)

self._endpoint = endpoint or DEFAULT_ENDPOINT
self._host, self._port = self._parse_endpoint(self._endpoint)
self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Expand Down Expand Up @@ -61,6 +57,10 @@ def _parse_endpoint(self, endpoint: str) -> Tuple[str, int]:

class OTLPUdpSpanExporter(SpanExporter):
def __init__(self, endpoint: Optional[str] = None, sampled: bool = True):
if endpoint is None and "AWS_LAMBDA_FUNCTION_NAME" in os.environ:
# If in an AWS Lambda Environment, `AWS_XRAY_DAEMON_ADDRESS` will be defined
endpoint = os.environ.get("AWS_XRAY_DAEMON_ADDRESS", DEFAULT_ENDPOINT)

self._udp_exporter = UdpExporter(endpoint=endpoint)
self._sampled = sampled

Expand Down
65 changes: 0 additions & 65 deletions exporters/aws-otel-otlp-udp-exporter/validation-app/app.py

This file was deleted.

48 changes: 48 additions & 0 deletions sample-applications/integ-test-app/udp_exporter_validation_app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
from flask import Flask, jsonify

from amazon.opentelemetry.exporters.otlp.udp import OTLPUdpSpanExporter
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor

app = Flask(__name__)

# Set up tracer provider
tracer_provider = TracerProvider()
trace.set_tracer_provider(tracer_provider)

# Set up UDP exporter with batch processor
exporter = OTLPUdpSpanExporter(endpoint="127.0.0.1:2000")
span_processor = BatchSpanProcessor(exporter)
tracer_provider.add_span_processor(span_processor)

# Get tracer
tracer = trace.get_tracer(__name__)


@app.route("/test", methods=["GET"])
def create_trace():
# Create a span for testing with various attributes
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("test_parent_span") as parent:
parent.set_attribute("service.name", "validation-app")
parent.set_attribute("test.attribute", "test_value")
parent.add_event("test-event", {"event.data": "some data"})

# Get the trace ID
trace_id = format(parent.get_span_context().trace_id, "032x")

# Add a child span
with tracer.start_as_current_span("test_child_span") as child:
child.set_attribute("child.attribute", "child_value")
print("Created spans with attributes and events")

# Force flush to ensure spans are exported immediately
success = tracer_provider.force_flush()
print(f"Force flush {'succeeded' if success else 'failed'}")

return jsonify({"trace_id": trace_id})


if __name__ == "__main__":
app.run(port=8080)

0 comments on commit 5f716c3

Please sign in to comment.