forked from open-telemetry/opentelemetry-lambda
-
Notifications
You must be signed in to change notification settings - Fork 0
229 lines (196 loc) · 8.86 KB
/
e2e-java.yml
File metadata and controls
229 lines (196 loc) · 8.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
name: E2E - Java Layer
on:
workflow_dispatch:
inputs:
logzio_api_url:
description: "Logz.io API base URL (default https://api.logz.io)"
required: false
default: "https://api.logz.io"
aws_region:
description: "AWS Region"
required: false
default: "us-east-1"
push:
branches:
- feat/unified-lambda-layer
permissions:
contents: read
env:
AWS_REGION: ${{ inputs.aws_region || 'us-east-1' }}
AWS_DEFAULT_REGION: ${{ inputs.aws_region || 'us-east-1' }}
ARCHITECTURE: amd64
FUNCTION_NAME: one-layer-e2e-test-java
LAYER_BASE_NAME: otel-java-extension-e2e
SERVICE_NAME: logzio-e2e-java-service
LOGZIO_REGION: us
jobs:
build-layer:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Go (for Collector)
uses: actions/setup-go@v5
with:
go-version-file: collector/go.mod
- name: Set up Java
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
cache: 'gradle'
- name: Build combined Java layer (amd64)
run: |
cd java
ARCHITECTURE=${ARCHITECTURE} ./build-combined.sh
- name: Upload layer artifact
uses: actions/upload-artifact@v4
with:
name: otel-java-extension-layer.zip
path: java/build/otel-java-extension-layer-${{ env.ARCHITECTURE }}.zip
publish-update-invoke:
runs-on: ubuntu-latest
needs: build-layer
outputs:
layer_arn: ${{ steps.publish.outputs.layer_arn }}
e2e_label: ${{ steps.vars.outputs.e2e_label }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download layer artifact
uses: actions/download-artifact@v4
with:
name: otel-java-extension-layer.zip
- name: Configure AWS (User Credentials)
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Publish layer version
id: publish
shell: bash
run: |
set -euo pipefail
LAYER_NAME="${LAYER_BASE_NAME}-amd64"
ZIP_FILE="otel-java-extension-layer-${ARCHITECTURE}.zip"
ARN=$(aws lambda publish-layer-version \
--layer-name "$LAYER_NAME" \
--license-info "Apache-2.0" \
--compatible-architectures x86_64 \
--compatible-runtimes java11 java17 \
--zip-file fileb://$ZIP_FILE \
--query 'LayerVersionArn' --output text)
echo "layer_arn=$ARN" >> "$GITHUB_OUTPUT"
- name: Prepare variables
id: vars
run: |
echo "e2e_label=java-e2e-${GITHUB_RUN_ID}" >> "$GITHUB_OUTPUT"
- name: Check function exists and get current config
run: |
echo "Checking if function exists and its current configuration..."
aws lambda get-function-configuration --function-name "${FUNCTION_NAME}" --query '{Role:Role,KMSKeyArn:KMSKeyArn,State:State,LastUpdateStatus:LastUpdateStatus}' --output table || {
echo "❌ Function ${FUNCTION_NAME} does not exist or is not accessible."
exit 1
}
echo "Current environment variables:"
aws lambda get-function-configuration --function-name "${FUNCTION_NAME}" --query 'Environment.Variables' --output json || echo "No environment variables set"
- name: Update Lambda configuration
run: |
echo "Updating function configuration..."
aws lambda update-function-configuration \
--function-name "${FUNCTION_NAME}" \
--layers "${{ steps.publish.outputs.layer_arn }}" \
--environment "Variables={AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-handler,OPENTELEMETRY_COLLECTOR_CONFIG_URI=/opt/collector-config/config.e2e.yaml,OTEL_SERVICE_NAME=${SERVICE_NAME},OTEL_TRACES_SAMPLER=always_on,OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf,OTEL_RESOURCE_ATTRIBUTES=deployment.environment=${{ steps.vars.outputs.e2e_label }},ENVIRONMENT=${{ steps.vars.outputs.e2e_label }},LOGZIO_REGION=${LOGZIO_REGION},LOGZIO_LOGS_TOKEN=${{ secrets.LOGZIO_LOGS_TOKEN }},LOGZIO_TRACES_TOKEN=${{ secrets.LOGZIO_TRACES_TOKEN }},LOGZIO_METRICS_TOKEN=${{ secrets.LOGZIO_METRICS_TOKEN }}}"
echo "Waiting for function update to complete..."
aws lambda wait function-updated --function-name "${FUNCTION_NAME}"
echo "Updated configuration:"
aws lambda get-function-configuration --function-name "${FUNCTION_NAME}" --query '{Layers:Layers[].Arn,Environment:Environment.Variables}' --output json
- name: Invoke function multiple times
run: |
echo "Invoking function first time..."
aws lambda invoke --function-name "${FUNCTION_NAME}" --payload '{}' --cli-binary-format raw-in-base64-out response1.json
echo "First invocation response:"
cat response1.json
echo ""
echo "Invoking function second time..."
aws lambda invoke --function-name "${FUNCTION_NAME}" --payload '{}' --cli-binary-format raw-in-base64-out response2.json
echo "Second invocation response:"
cat response2.json
echo ""
echo "Sleeping for 5 seconds before additional invocations..."
sleep 5
echo "Invoking function third time..."
aws lambda invoke --function-name "${FUNCTION_NAME}" --payload '{}' --cli-binary-format raw-in-base64-out response3.json
echo "Third invocation response:"
cat response3.json
echo ""
echo "Invoking function fourth time..."
aws lambda invoke --function-name "${FUNCTION_NAME}" --payload '{}' --cli-binary-format raw-in-base64-out response4.json
echo "Fourth invocation response:"
cat response4.json
echo ""
echo "Invoking function fifth time..."
aws lambda invoke --function-name "${FUNCTION_NAME}" --payload '{}' --cli-binary-format raw-in-base64-out response5.json
echo "Fifth invocation response:"
cat response5.json
echo ""
- name: Check CloudWatch logs
run: |
echo "Checking recent CloudWatch logs for the function..."
LOG_GROUP_NAME="/aws/lambda/${FUNCTION_NAME}"
# Get recent log events (last 5 minutes)
aws logs filter-log-events \
--log-group-name "$LOG_GROUP_NAME" \
--start-time $(date -d '5 minutes ago' +%s)000 \
--query 'events[].message' \
--output text || {
echo "❌ Could not fetch CloudWatch logs. Log group might not exist or no recent logs."
echo "Checking if log group exists..."
aws logs describe-log-groups --log-group-name-prefix "$LOG_GROUP_NAME" --query 'logGroups[].logGroupName' --output text
}
verify-e2e:
runs-on: ubuntu-latest
needs: publish-update-invoke
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.21'
- name: Run E2E verification tests
working-directory: e2e_tests
env:
LOGZIO_API_KEY: ${{ secrets.LOGZIO_API_KEY }}
LOGZIO_API_URL: ${{ inputs.logzio_api_url || 'https://api.logz.io' }}
LOGZIO_API_METRICS_KEY: ${{ secrets.LOGZIO_API_METRICS_KEY }}
LOGZIO_METRICS_QUERY_URL: ${{ inputs.logzio_api_url || 'https://api.logz.io' }}
LOGZIO_API_TRACES_KEY: ${{ secrets.LOGZIO_API_TRACES_KEY }}
E2E_TEST_ENVIRONMENT_LABEL: ${{ needs.publish-update-invoke.outputs.e2e_label }}
EXPECTED_LAMBDA_FUNCTION_NAME: one-layer-e2e-test-java
EXPECTED_SERVICE_NAME: ${{ env.SERVICE_NAME }}
GITHUB_RUN_ID: ${{ github.run_id }}
AWS_REGION: ${{ env.AWS_REGION }}
run: |
go mod tidy
go test ./... -v -tags=e2e -run TestE2ERunner
cleanup:
if: always()
runs-on: ubuntu-latest
needs: [publish-update-invoke, verify-e2e]
steps:
- name: Configure AWS (User Credentials)
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ inputs.aws_region || 'us-east-1' }}
- name: Delete published layer version
if: ${{ needs.publish-update-invoke.outputs.layer_arn != '' }}
shell: bash
run: |
ARN="${{ needs.publish-update-invoke.outputs.layer_arn }}"
LAYER_NAME=$(echo "$ARN" | cut -d: -f7)
LAYER_VERSION=$(echo "$ARN" | cut -d: -f8)
aws lambda delete-layer-version --layer-name "$LAYER_NAME" --version-number "$LAYER_VERSION" || echo "Failed to delete layer version."