-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMakefile
More file actions
280 lines (237 loc) · 13.6 KB
/
Copy pathMakefile
File metadata and controls
280 lines (237 loc) · 13.6 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
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
ZIP_NAME_PYTHON = layer-dash0-python.zip
ZIP_NAME_NODE = layer-dash0-node.zip
ZIP_NAME_JAVA = layer-dash0-java.zip
ZIP_NAME_MANUAL = layer-dash0-manual.zip
LAYER_NAME_PREFIX ?=
LAYER_NAME_PYTHON = $(LAYER_NAME_PREFIX)dash0-extension-python
LAYER_NAME_NODE = $(LAYER_NAME_PREFIX)dash0-extension-node
LAYER_NAME_JAVA = $(LAYER_NAME_PREFIX)dash0-extension-java
LAYER_NAME_MANUAL = $(LAYER_NAME_PREFIX)dash0-extension-manual
LAMBDA_LAYER_MARKER_PYTHON := .lambda-layer-python
LAMBDA_LAYER_MARKER_NODE := .lambda-layer-node
LAMBDA_LAYER_MARKER_JAVA := .lambda-layer-java
LAMBDA_LAYER_MARKER_MANUAL := .lambda-layer-manual
CARGO_FEATURES :=
PYTHON_DEPS_IMAGE := dash0-python-deps
LAYER_DESCRIPTION := Send traces, metrics, and logs from AWS Lambda to Dash0. Built on OpenTelemetry and AWS Lambda Extensions API.
# Docker/ECR image settings
AWS_ACCOUNT_ID := $(shell aws sts get-caller-identity --query Account --output text)
AWS_REGION ?= $(shell aws configure get region)
ECR_REGISTRY := $(AWS_ACCOUNT_ID).dkr.ecr.$(AWS_REGION).amazonaws.com
ECR_REPO_PREFIX ?=
ECR_REPO_PYTHON ?= $(ECR_REPO_PREFIX)dash0-extension-python
ECR_REPO_NODE ?= $(ECR_REPO_PREFIX)dash0-extension-node
ECR_REPO_JAVA ?= $(ECR_REPO_PREFIX)dash0-extension-java
DOCKER_IMAGE_PYTHON := $(ECR_REGISTRY)/$(ECR_REPO_PYTHON)
DOCKER_IMAGE_NODE := $(ECR_REGISTRY)/$(ECR_REPO_NODE)
DOCKER_IMAGE_JAVA := $(ECR_REGISTRY)/$(ECR_REPO_JAVA)
VERSION ?= latest
#-- current-condition vars
# Check if Docker is available or running-- needed by `cargo cross`.
# modify if not cross-compiling or if using different tooling
DOCKER_RUNNING := $(shell docker ps > /dev/null 2>&1 && echo -n yes)
RS_FILES := $(shell find src -name "*.rs")
.phony: build clean cargo zip clean-build clean-cargo deploy-layer doc python node java manual docker-python docker-node docker-java
# * Build both x86_64 and aarch64 binaries
# * create a Layer '.zip'
# * use AWS CLI to publish Lambda layer
#
default: python node java manual docker-python docker-node docker-java
clean: clean-build clean-cargo
clean-build:
@rm -rf build
@rm -f .lambda-layer*
clean-cargo:
@cargo clean
build/dash0_x86_64: $(RS_FILES) Cargo.toml
@echo Building Rust application for x86_64
@mkdir -p build
@cross build --release --target x86_64-unknown-linux-musl ${CARGO_FEATURES}
@cp target/x86_64-unknown-linux-musl/release/aws-lambda-runtime-api-proxy-rs build/dash0_x86_64
build/dash0_aarch64: $(RS_FILES) Cargo.toml
@echo Building Rust application for aarch64
@mkdir -p build
@cross build --release --target aarch64-unknown-linux-musl ${CARGO_FEATURES}
@cp target/aarch64-unknown-linux-musl/release/aws-lambda-runtime-api-proxy-rs build/dash0_aarch64
PYTHON_DISTRO_SRC := $(shell find opt/python/distro/src -type f)
NODE_DISTRO_SRC := $(shell find opt/node/distro/src -type f)
JAVA_DISTRO_SRC := $(shell find opt/java/opentelemetry-java-distro -type f \( -path '*/src/*' -o -name '*.gradle' -o -name 'gradle.properties' \))
build/python: opt/python/distro/requirements.txt opt/python/Dockerfile $(PYTHON_DISTRO_SRC)
@mkdir -p build
@rm -rf build/python
@docker build -t $(PYTHON_DEPS_IMAGE) -f opt/python/Dockerfile .
@cid=$$(docker create $(PYTHON_DEPS_IMAGE)); \
docker cp $$cid:/asset-output/python build/python; \
docker rm $$cid >/dev/null
build/$(ZIP_NAME_PYTHON): build/dash0_x86_64 build/dash0_aarch64 opt/entrypoint opt/shared.sh opt/python/wrapper opt/python/otel_wrapper.py build/python
@rm -f build/$(ZIP_NAME_PYTHON)
@rm -rf build/stage-python
@mkdir -p build/stage-python/extensions
@cp build/dash0_x86_64 build/stage-python/
@cp build/dash0_aarch64 build/stage-python/
@cp opt/entrypoint build/stage-python/extensions/dash0
@cp opt/shared.sh build/stage-python/shared.sh
@cp opt/python/wrapper build/stage-python/wrapper
@cp -r build/python build/stage-python/python
@cp opt/python/otel_wrapper.py build/stage-python/python/otel_wrapper.py
@git rev-parse HEAD > build/stage-python/dash0_git_hash
@cd build/stage-python && zip -r ../$(ZIP_NAME_PYTHON) *
build/$(ZIP_NAME_NODE): build/dash0_x86_64 build/dash0_aarch64 opt/entrypoint opt/shared.sh opt/node/package.json opt/node/wrapper opt/node/webpack.config.mjs opt/node/init.mjs $(NODE_DISTRO_SRC)
@echo Building Node.js layer
@rm -f build/$(ZIP_NAME_NODE)
@rm -rf build/stage-node
@mkdir -p build/stage-node/extensions
@cp build/dash0_x86_64 build/stage-node/
@cp build/dash0_aarch64 build/stage-node/
@cp opt/entrypoint build/stage-node/extensions/dash0
@cp opt/shared.sh build/stage-node/shared.sh
@cp opt/node/wrapper build/stage-node/wrapper
@bash opt/node/scripts/build-aws-sdk-tarball.sh
@cd opt/node && npm install && npm run build
@cp opt/node/dist/init.mjs build/stage-node/
@# Copy only the external dependencies needed at runtime
@mkdir -p build/stage-node/node_modules
@cp -r opt/node/node_modules/require-in-the-middle build/stage-node/node_modules/
@cp -r opt/node/node_modules/import-in-the-middle build/stage-node/node_modules/
@cp -r opt/node/node_modules/module-details-from-path build/stage-node/node_modules/
@cp -r opt/node/node_modules/debug build/stage-node/node_modules/
@cp -r opt/node/node_modules/ms build/stage-node/node_modules/
@cp -r opt/node/node_modules/acorn build/stage-node/node_modules/
@cp -r opt/node/node_modules/acorn-import-attributes build/stage-node/node_modules/ 2>/dev/null || true
@cp -r opt/node/node_modules/cjs-module-lexer build/stage-node/node_modules/
@git rev-parse HEAD > build/stage-node/dash0_git_hash
@cd build/stage-node && zip -r ../$(ZIP_NAME_NODE) *
JAVA_DISTRO_JAR := opt/java/opentelemetry-java-distro/agent/build/libs/agent-1.0.0-SNAPSHOT-all.jar
JAVA_CLASSPATH_LIBS_DIR := opt/java/opentelemetry-java-distro/agent/build/classpath-libs
$(JAVA_DISTRO_JAR): $(JAVA_DISTRO_SRC)
@echo Building Java distro
@cd opt/java/opentelemetry-java-distro && ./gradlew clean -Pversion=1.0.0-SNAPSHOT assemble -x javadoc
build/$(ZIP_NAME_JAVA): build/dash0_x86_64 build/dash0_aarch64 opt/entrypoint opt/shared.sh opt/java/wrapper $(JAVA_DISTRO_JAR)
@echo Building Java layer
@rm -f build/$(ZIP_NAME_JAVA)
@rm -rf build/stage-java
@mkdir -p build/stage-java/extensions
@mkdir -p build/stage-java/java/lib
@cp build/dash0_x86_64 build/stage-java/
@cp build/dash0_aarch64 build/stage-java/
@cp opt/entrypoint build/stage-java/extensions/dash0
@cp opt/shared.sh build/stage-java/shared.sh
@cp opt/java/wrapper build/stage-java/wrapper
@cp $(JAVA_DISTRO_JAR) build/stage-java/java/lib/dash0-opentelemetry.jar
@cp $(JAVA_CLASSPATH_LIBS_DIR)/*.jar build/stage-java/java/lib/
@git rev-parse HEAD > build/stage-java/dash0_git_hash
@cd build/stage-java && zip -r ../$(ZIP_NAME_JAVA) *
build/$(ZIP_NAME_MANUAL): build/dash0_x86_64 build/dash0_aarch64 opt/entrypoint opt/shared.sh opt/manual/wrapper
@echo Building Manual layer
@rm -f build/$(ZIP_NAME_MANUAL)
@rm -rf build/stage-manual
@mkdir -p build/stage-manual/extensions
@cp build/dash0_x86_64 build/stage-manual/
@cp build/dash0_aarch64 build/stage-manual/
@cp opt/entrypoint build/stage-manual/extensions/dash0
@cp opt/shared.sh build/stage-manual/shared.sh
@cp opt/manual/wrapper build/stage-manual/wrapper
@git rev-parse HEAD > build/stage-manual/dash0_git_hash
@cd build/stage-manual && zip -r ../$(ZIP_NAME_MANUAL) *
python: $(LAMBDA_LAYER_MARKER_PYTHON)
node: $(LAMBDA_LAYER_MARKER_NODE)
java: $(LAMBDA_LAYER_MARKER_JAVA)
manual: $(LAMBDA_LAYER_MARKER_MANUAL)
$(LAMBDA_LAYER_MARKER_PYTHON): build/$(ZIP_NAME_PYTHON)
@echo "Publishing Lambda Extension to layer \"$(LAYER_NAME_PYTHON)\""
@LAYER_VERSION=$$(aws lambda publish-layer-version --layer-name $(LAYER_NAME_PYTHON) --zip-file fileb://build/$(ZIP_NAME_PYTHON) \
--description "$(LAYER_DESCRIPTION)" \
--compatible-architectures x86_64 arm64 --no-cli-pager --query Version --output text) && \
echo "Making $(LAYER_NAME_PYTHON) version $$LAYER_VERSION public" && \
aws lambda add-layer-version-permission --layer-name $(LAYER_NAME_PYTHON) --version-number $$LAYER_VERSION \
--statement-id public --action lambda:GetLayerVersion --principal "*" --no-cli-pager
@touch $(LAMBDA_LAYER_MARKER_PYTHON)
$(LAMBDA_LAYER_MARKER_NODE): build/$(ZIP_NAME_NODE)
@echo "Publishing Lambda Extension to layer \"$(LAYER_NAME_NODE)\""
@LAYER_VERSION=$$(aws lambda publish-layer-version --layer-name $(LAYER_NAME_NODE) --zip-file fileb://build/$(ZIP_NAME_NODE) \
--description "$(LAYER_DESCRIPTION)" \
--compatible-architectures x86_64 arm64 --no-cli-pager --query Version --output text) && \
echo "Making $(LAYER_NAME_NODE) version $$LAYER_VERSION public" && \
aws lambda add-layer-version-permission --layer-name $(LAYER_NAME_NODE) --version-number $$LAYER_VERSION \
--statement-id public --action lambda:GetLayerVersion --principal "*" --no-cli-pager
@touch $(LAMBDA_LAYER_MARKER_NODE)
$(LAMBDA_LAYER_MARKER_JAVA): build/$(ZIP_NAME_JAVA)
@echo "Publishing Lambda Extension to layer \"$(LAYER_NAME_JAVA)\""
@LAYER_VERSION=$$(aws lambda publish-layer-version --layer-name $(LAYER_NAME_JAVA) --zip-file fileb://build/$(ZIP_NAME_JAVA) \
--description "$(LAYER_DESCRIPTION)" \
--compatible-architectures x86_64 arm64 --no-cli-pager --query Version --output text) && \
echo "Making $(LAYER_NAME_JAVA) version $$LAYER_VERSION public" && \
aws lambda add-layer-version-permission --layer-name $(LAYER_NAME_JAVA) --version-number $$LAYER_VERSION \
--statement-id public --action lambda:GetLayerVersion --principal "*" --no-cli-pager
@touch $(LAMBDA_LAYER_MARKER_JAVA)
$(LAMBDA_LAYER_MARKER_MANUAL): build/$(ZIP_NAME_MANUAL)
@echo "Publishing Lambda Extension to layer \"$(LAYER_NAME_MANUAL)\""
@LAYER_VERSION=$$(aws lambda publish-layer-version --layer-name $(LAYER_NAME_MANUAL) --zip-file fileb://build/$(ZIP_NAME_MANUAL) \
--description "$(LAYER_DESCRIPTION)" \
--compatible-architectures x86_64 arm64 --no-cli-pager --query Version --output text) && \
echo "Making $(LAYER_NAME_MANUAL) version $$LAYER_VERSION public" && \
aws lambda add-layer-version-permission --layer-name $(LAYER_NAME_MANUAL) --version-number $$LAYER_VERSION \
--statement-id public --action lambda:GetLayerVersion --principal "*" --no-cli-pager
@touch $(LAMBDA_LAYER_MARKER_MANUAL)
doc:
@cargo doc
@echo
@echo "Docs are located in target/doc/aws_lambda_runtime_api_proxy_rs/index.html"
# =============================================================================
# Docker targets for containerized Lambda deployments
# Multi-platform builds (linux/amd64 + linux/arm64) using docker buildx
# =============================================================================
BUILDX_BUILDER := multiplatform-builder
# Ensure buildx builder exists for multi-platform builds
.PHONY: ensure-buildx
ensure-buildx:
@docker buildx inspect $(BUILDX_BUILDER) >/dev/null 2>&1 || \
docker buildx create --name $(BUILDX_BUILDER) --use --bootstrap
# Build and push Docker image for Python extension to ECR
# Usage: make docker-python VERSION=1.0.0
docker-python: build/dash0_x86_64 build/dash0_aarch64 build/python ensure-buildx
@echo "Creating ECR repository $(ECR_REPO_PYTHON) if it doesn't exist..."
@aws ecr describe-repositories --repository-names $(ECR_REPO_PYTHON) 2>/dev/null || \
aws ecr create-repository --repository-name $(ECR_REPO_PYTHON) --no-cli-pager
@echo "Logging in to ECR..."
@aws ecr get-login-password --region $(AWS_REGION) | docker login --username AWS --password-stdin $(ECR_REGISTRY)
@echo "Building and pushing multi-platform Docker image $(DOCKER_IMAGE_PYTHON):$(VERSION)"
@docker buildx build --builder $(BUILDX_BUILDER) --platform linux/amd64,linux/arm64 \
-f opt/docker/Dockerfile.python -t $(DOCKER_IMAGE_PYTHON):$(VERSION) --push .
@echo ""
@echo "Usage in your Dockerfile:"
@echo " COPY --from=$(DOCKER_IMAGE_PYTHON):$(VERSION) /opt /opt"
@echo " ENV AWS_LAMBDA_EXEC_WRAPPER=/opt/wrapper"
# Build and push Docker image for Node.js extension to ECR
# Usage: make docker-node VERSION=1.0.0
docker-node: build/dash0_x86_64 build/dash0_aarch64 ensure-buildx
@echo "Building Node.js SDK..."
@bash opt/node/scripts/build-aws-sdk-tarball.sh
@cd opt/node && npm install && npm run build
@echo "Creating ECR repository $(ECR_REPO_NODE) if it doesn't exist..."
@aws ecr describe-repositories --repository-names $(ECR_REPO_NODE) 2>/dev/null || \
aws ecr create-repository --repository-name $(ECR_REPO_NODE) --no-cli-pager
@echo "Logging in to ECR..."
@aws ecr get-login-password --region $(AWS_REGION) | docker login --username AWS --password-stdin $(ECR_REGISTRY)
@echo "Building and pushing multi-platform Docker image $(DOCKER_IMAGE_NODE):$(VERSION)"
@docker buildx build --builder $(BUILDX_BUILDER) --platform linux/amd64,linux/arm64 \
-f opt/docker/Dockerfile.node -t $(DOCKER_IMAGE_NODE):$(VERSION) --push .
@echo ""
@echo "Usage in your Dockerfile:"
@echo " COPY --from=$(DOCKER_IMAGE_NODE):$(VERSION) /opt /opt"
@echo " ENV AWS_LAMBDA_EXEC_WRAPPER=/opt/wrapper"
# Build and push Docker image for Java extension to ECR
# Usage: make docker-java VERSION=1.0.0
docker-java: build/dash0_x86_64 build/dash0_aarch64 $(JAVA_DISTRO_JAR) ensure-buildx
@echo "Creating ECR repository $(ECR_REPO_JAVA) if it doesn't exist..."
@aws ecr describe-repositories --repository-names $(ECR_REPO_JAVA) 2>/dev/null || \
aws ecr create-repository --repository-name $(ECR_REPO_JAVA) --no-cli-pager
@echo "Logging in to ECR..."
@aws ecr get-login-password --region $(AWS_REGION) | docker login --username AWS --password-stdin $(ECR_REGISTRY)
@echo "Building and pushing multi-platform Docker image $(DOCKER_IMAGE_JAVA):$(VERSION)"
@docker buildx build --builder $(BUILDX_BUILDER) --platform linux/amd64,linux/arm64 \
-f opt/docker/Dockerfile.java -t $(DOCKER_IMAGE_JAVA):$(VERSION) --push .
@echo ""
@echo "Usage in your Dockerfile:"
@echo " COPY --from=$(DOCKER_IMAGE_JAVA):$(VERSION) /opt /opt"
@echo " ENV AWS_LAMBDA_EXEC_WRAPPER=/opt/wrapper"