Skip to content

Commit fb0ff91

Browse files
authored
feat: upload sourcemaps to dd and enable git integration (#1765)
1 parent 984134f commit fb0ff91

File tree

11 files changed

+2210
-67
lines changed

11 files changed

+2210
-67
lines changed

.github/workflows/build-and-push.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,8 @@ jobs:
240240
NEXT_PUBLIC_DATADOG_SITE=${{ secrets.NEXT_PUBLIC_DATADOG_SITE }}
241241
S3_BUCKET=${{ vars.STATIC_ASSETS_S3_BUCKET }}
242242
STATIC_ASSETS_HOST=${{ vars.STATIC_ASSETS_HOST }}
243+
DD_GIT_REPOSITORY_URL=${{ github.server_url }}/${{ github.repository }}
244+
DD_GIT_COMMIT_SHA=${{ github.sha }}
243245
244246
run-migrations:
245247
needs: [build-and-push-private]

apps/gateway/docker/Dockerfile

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
ARG PROJECT="@latitude-data/gateway"
22
ARG PROJECT_PATH="apps/gateway"
3+
ARG DD_GIT_REPOSITORY_URL
4+
ARG DD_GIT_COMMIT_SHA
35

46
FROM node:22-alpine AS alpine
57

@@ -64,6 +66,15 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
6466
BUILDING_CONTAINER=true \
6567
pnpm turbo build --filter="${PROJECT}..."
6668

69+
# Upload source maps to Datadog
70+
RUN if [ -n "$DD_GIT_COMMIT_SHA" ] && [ -n "$DD_GIT_REPOSITORY_URL" ] && [ -n "$NEXT_PUBLIC_DATADOG_APPLICATION_ID" ] && [ -n "$NEXT_PUBLIC_DATADOG_CLIENT_TOKEN" ]; then \
71+
echo "Uploading gateway source maps to Datadog..."; \
72+
cd apps/gateway && \
73+
DD_API_KEY=$NEXT_PUBLIC_DATADOG_APPLICATION_ID DD_APP_KEY=$NEXT_PUBLIC_DATADOG_CLIENT_TOKEN pnpm datadog:sourcemaps; \
74+
else \
75+
echo "Skipping Datadog source map upload for gateway - missing required environment variables"; \
76+
fi
77+
6778
# Since `pnpm prune` doesn't handle recursive dependencies effectively,
6879
# we follow pnpm's recommended approach: remove node_modules entirely
6980
# and perform a fresh production install with --frozen-lockfile
@@ -77,11 +88,20 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install \
7788
--shamefully-hoist \
7889
--filter "${PROJECT}..."
7990

80-
FROM alpine AS runner
91+
FROM node:22-alpine AS runner
8192

8293
ARG PROJECT_PATH
94+
ARG DD_GIT_REPOSITORY_URL
95+
ARG DD_GIT_COMMIT_SHA
96+
ARG PORT=8080
8397

98+
ENV PORT=$PORT
8499
ENV NODE_ENV=production
100+
ENV KEEP_ALIVE_TIMEOUT=601000
101+
ENV DD_GIT_REPOSITORY_URL=${DD_GIT_REPOSITORY_URL:-}
102+
ENV DD_GIT_COMMIT_SHA=${DD_GIT_COMMIT_SHA:-}
103+
104+
EXPOSE $PORT
85105

86106
# Install AWS CLI using Alpine package manager
87107
RUN apk add --no-cache \
@@ -102,21 +122,13 @@ USER latitude
102122

103123
WORKDIR /app
104124

105-
COPY --from=builder --chown=nodejs:latitude /app/node_modules ./node_modules
106-
COPY --from=builder --chown=nodejs:latitude /app/${PROJECT_PATH} ./${PROJECT_PATH}
107-
COPY --from=builder --chown=nodejs:latitude /app/packages/telemetry/typescript ./packages/telemetry/typescript
108-
COPY --from=builder --chown=nodejs:latitude /app/packages/sdks/typescript ./packages/sdks/typescript
109-
COPY --from=builder --chown=nodejs:latitude /app/packages/core/src/assets/eu-central-1-bundle.pem ./packages/core/src/assets/eu-central-1-bundle.pem
125+
COPY --from=builder --chown=latitude:nodejs /app/node_modules ./node_modules
126+
COPY --from=builder --chown=latitude:nodejs /app/${PROJECT_PATH} ./${PROJECT_PATH}
127+
COPY --from=builder --chown=latitude:nodejs /app/packages/telemetry/typescript ./packages/telemetry/typescript
128+
COPY --from=builder --chown=latitude:nodejs /app/packages/sdks/typescript ./packages/sdks/typescript
129+
COPY --from=builder --chown=latitude:nodejs /app/packages/core/src/assets/eu-central-1-bundle.pem ./packages/core/src/assets/eu-central-1-bundle.pem
110130

111131
WORKDIR /app/${PROJECT_PATH}
112132

113-
ARG PORT=8080
114-
115-
ENV PORT=$PORT
116-
ENV NODE_ENV=production
117-
ENV KEEP_ALIVE_TIMEOUT=601000
118-
119-
EXPOSE $PORT
120-
121133
CMD ["node", "dist/server.js"]
122134

apps/gateway/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
"lint": "eslint src/",
1212
"tc": "tsc --noEmit",
1313
"test": "vitest --run",
14-
"test:watch": "vitest"
14+
"test:watch": "vitest",
15+
"datadog:sourcemaps": "datadog-ci sourcemaps upload dist --service=latitude-gateway --minified-path-prefix=/app/apps/gateway/dist"
1516
},
1617
"dependencies": {
1718
"@hono/node-server": "1.13.2",
@@ -33,6 +34,7 @@
3334
"dd-trace": "catalog:"
3435
},
3536
"devDependencies": {
37+
"@datadog/datadog-ci": "catalog:",
3638
"@latitude-data/eslint-config": "workspace:^",
3739
"@latitude-data/typescript-config": "workspace:^",
3840
"@types/lodash-es": "^4.17.12",

apps/web/docker/Dockerfile

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ ARG NEXT_PUBLIC_DATADOG_SITE
77
ARG AWS_REGION
88
ARG S3_BUCKET
99
ARG BUILD_ID
10+
ARG DD_GIT_REPOSITORY_URL
11+
ARG DD_GIT_COMMIT_SHA
1012

1113

1214
FROM node:22-alpine AS alpine
@@ -47,7 +49,7 @@ RUN npm install -g [email protected] && corepack enable
4749
ENV PNPM_HOME="/pnpm"
4850
ENV PATH="$PNPM_HOME:$PATH"
4951

50-
# Install turbo with npm instead of pnpm to avoid key verification issues
52+
# Install turbo globally
5153
RUN pnpm install -g turbo
5254

5355
FROM base AS pruner
@@ -87,12 +89,16 @@ ARG AWS_REGION
8789
ARG S3_BUCKET
8890
ARG BUILD_ID
8991
ARG STATIC_ASSETS_HOST
92+
ARG DD_GIT_REPOSITORY_URL
93+
ARG DD_GIT_COMMIT_SHA
9094

9195
# Set environment variables with defaults
9296
ENV AWS_REGION=${AWS_REGION:-}
9397
ENV S3_BUCKET=${S3_BUCKET:-}
9498
ENV BUILD_ID=${BUILD_ID:-}
9599
ENV STATIC_ASSETS_HOST=${STATIC_ASSETS_HOST:-}
100+
ENV DD_GIT_REPOSITORY_URL=${DD_GIT_REPOSITORY_URL:-}
101+
ENV DD_GIT_COMMIT_SHA=${DD_GIT_COMMIT_SHA:-}
96102

97103
WORKDIR /app
98104

@@ -148,18 +154,31 @@ else \
148154
echo "Skipping S3 upload - S3_BUCKET or BUILD_ID not provided"; \
149155
fi
150156

157+
# Upload source maps to Datadog
158+
RUN if [ -n "$DD_GIT_COMMIT_SHA" ] && [ -n "$DD_GIT_REPOSITORY_URL" ] && [ -n "$NEXT_PUBLIC_DATADOG_APPLICATION_ID" ] && [ -n "$NEXT_PUBLIC_DATADOG_CLIENT_TOKEN" ]; then \
159+
echo "Uploading source maps to Datadog..."; \
160+
cd apps/web && \
161+
DD_API_KEY=$NEXT_PUBLIC_DATADOG_APPLICATION_ID DD_APP_KEY=$NEXT_PUBLIC_DATADOG_CLIENT_TOKEN pnpm datadog:sourcemaps; \
162+
else \
163+
echo "Skipping Datadog source map upload - missing required environment variables"; \
164+
fi
165+
151166
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm prune --prod --no-optional
152167

153168
# PRODUCTION
154-
FROM alpine AS runner
169+
FROM node:22-alpine AS runner
155170

156171
ARG PROJECT_PATH
172+
ARG DD_GIT_REPOSITORY_URL
173+
ARG DD_GIT_COMMIT_SHA
157174

158175
ENV HOSTNAME=0.0.0.0
159176
ENV KEEP_ALIVE_TIMEOUT=601000
160177
ENV NEXT_TELEMETRY_DISABLED=1
161178
ENV NODE_ENV=production
162179
ENV PORT=8080
180+
ENV DD_GIT_REPOSITORY_URL=${DD_GIT_REPOSITORY_URL:-}
181+
ENV DD_GIT_COMMIT_SHA=${DD_GIT_COMMIT_SHA:-}
163182

164183
WORKDIR /app
165184

@@ -192,9 +211,9 @@ RUN chown nextjs:nodejs apps/web/.next
192211
RUN chown nextjs:nodejs apps/web/.next/cache
193212

194213
# Copy the standalone server and node_modules
195-
COPY --from=builder --chown=nodejs:nextjs /app/apps/web/.next/standalone ./
196-
COPY --from=builder --chown=nodejs:nextjs /app/apps/web/.next/static ./apps/web/.next/static
197-
COPY --from=builder --chown=nodejs:nextjs /app/apps/web/node_modules ./apps/web/node_modules
214+
COPY --from=builder --chown=nextjs:nodejs /app/apps/web/.next/standalone ./
215+
COPY --from=builder --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/web/.next/static
216+
COPY --from=builder --chown=nextjs:nodejs /app/apps/web/node_modules ./apps/web/node_modules
198217
# Set permissions for local storage
199218
# User ID and Group ID 1001 is used to match the user 'nextjs' and group 'nodejs' in the runner image.
200219
RUN set -e; \

apps/web/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
"start": "next start",
1515
"tc": "tsc --noEmit",
1616
"test": "TZ=UTC vitest --run",
17-
"test:watch": "TZ=UTC vitest"
17+
"test:watch": "TZ=UTC vitest",
18+
"datadog:sourcemaps": "datadog-ci sourcemaps upload .next/static --service=latitude-web --minified-path-prefix=/_next/static"
1819
},
1920
"dependencies": {
2021
"@aws-sdk/client-s3": "3.850.0",
@@ -84,6 +85,7 @@
8485
"zustand": "4.5.6"
8586
},
8687
"devDependencies": {
88+
"@datadog/datadog-ci": "catalog:",
8789
"@faker-js/faker": "^8.4.1",
8890
"@latitude-data/eslint-config": "workspace:*",
8991
"@latitude-data/typescript-config": "workspace:*",

apps/websockets/docker/Dockerfile

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install \
6161
--shamefully-hoist \
6262
--filter "${PROJECT}..."
6363

64-
FROM alpine AS runner
64+
FROM node:22-alpine AS runner
6565

6666
ARG PROJECT_PATH
6767

@@ -73,15 +73,14 @@ USER latitude
7373

7474
WORKDIR /app
7575

76-
COPY --from=builder --chown=nodejs:latitude /app/node_modules ./node_modules
77-
COPY --from=builder --chown=nodejs:latitude /app/${PROJECT_PATH} ./${PROJECT_PATH}
76+
COPY --from=builder --chown=latitude:nodejs /app/node_modules ./node_modules
77+
COPY --from=builder --chown=latitude:nodejs /app/${PROJECT_PATH} ./${PROJECT_PATH}
7878

7979
WORKDIR /app/${PROJECT_PATH}
8080

8181
ARG PORT=8080
8282

8383
ENV PORT=$PORT
84-
ENV NODE_ENV=production
8584

8685
EXPOSE $PORT
8786

apps/workers/docker/Dockerfile

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
ARG PROJECT="@latitude-data/workers"
22
ARG PROJECT_PATH="apps/workers"
3+
ARG NEXT_PUBLIC_DATADOG_APPLICATION_ID
4+
ARG NEXT_PUBLIC_DATADOG_CLIENT_TOKEN
5+
ARG NEXT_PUBLIC_DATADOG_SITE
6+
ARG DD_GIT_REPOSITORY_URL
7+
ARG DD_GIT_COMMIT_SHA
38

49
FROM node:22-alpine AS alpine
510

@@ -49,17 +54,17 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install \
4954
COPY --from=pruner /app/out/full/ .
5055

5156
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
52-
--mount=type=secret,id=SENTRY_AUTH_TOKEN \
5357
BUILDING_CONTAINER=true \
54-
SENTRY_AUTH_TOKEN="$(cat /run/secrets/SENTRY_AUTH_TOKEN 2>/dev/null || echo '')" \
5558
pnpm turbo build --filter="${PROJECT}..."
5659

57-
# Run sentry:sourcemaps if SENTRY_AUTH_TOKEN secret is present and not empty
58-
RUN --mount=type=secret,id=SENTRY_AUTH_TOKEN \
59-
if [ -s /run/secrets/SENTRY_AUTH_TOKEN ]; then \
60-
cd ${PROJECT_PATH} && \
61-
SENTRY_AUTH_TOKEN="$(cat /run/secrets/SENTRY_AUTH_TOKEN)" pnpm sentry:sourcemaps; \
62-
fi
60+
# Upload source maps to Datadog
61+
RUN if [ -n "$DD_GIT_COMMIT_SHA" ] && [ -n "$DD_GIT_REPOSITORY_URL" ] && [ -n "$NEXT_PUBLIC_DATADOG_APPLICATION_ID" ] && [ -n "$NEXT_PUBLIC_DATADOG_CLIENT_TOKEN" ]; then \
62+
echo "Uploading workers source maps to Datadog..."; \
63+
cd apps/workers && \
64+
DD_API_KEY=$NEXT_PUBLIC_DATADOG_APPLICATION_ID DD_APP_KEY=$NEXT_PUBLIC_DATADOG_CLIENT_TOKEN pnpm datadog:sourcemaps; \
65+
else \
66+
echo "Skipping Datadog source map upload for workers - missing required environment variables"; \
67+
fi
6368

6469
# Since `pnpm prune` doesn't handle recursive dependencies effectively,
6570
# we follow pnpm's recommended approach: remove node_modules entirely
@@ -71,11 +76,19 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install \
7176
--shamefully-hoist \
7277
--filter "${PROJECT}..."
7378

74-
FROM alpine AS runner
79+
FROM node:22-alpine AS runner
7580

7681
ARG PROJECT_PATH
82+
ARG DD_GIT_REPOSITORY_URL
83+
ARG DD_GIT_COMMIT_SHA
84+
ARG PORT=8080
7785

86+
ENV PORT=$PORT
7887
ENV NODE_ENV=production
88+
ENV DD_GIT_REPOSITORY_URL=${DD_GIT_REPOSITORY_URL:-}
89+
ENV DD_GIT_COMMIT_SHA=${DD_GIT_COMMIT_SHA:-}
90+
91+
EXPOSE $PORT
7992

8093
# Install AWS CLI using Alpine package manager
8194
RUN apk add --no-cache \
@@ -95,19 +108,11 @@ USER latitude
95108

96109
WORKDIR /app
97110

98-
COPY --from=builder --chown=nodejs:latitude /app/node_modules ./node_modules
99-
COPY --from=builder --chown=nodejs:latitude /app/${PROJECT_PATH} ./${PROJECT_PATH}
100-
COPY --from=builder --chown=nodejs:latitude /app/packages/telemetry/typescript ./packages/telemetry/typescript
101-
COPY --from=builder --chown=nodejs:latitude /app/packages/core/src/assets/eu-central-1-bundle.pem ./packages/core/src/assets/eu-central-1-bundle.pem
111+
COPY --from=builder --chown=latitude:nodejs /app/node_modules ./node_modules
112+
COPY --from=builder --chown=latitude:nodejs /app/${PROJECT_PATH} ./${PROJECT_PATH}
113+
COPY --from=builder --chown=latitude:nodejs /app/packages/telemetry/typescript ./packages/telemetry/typescript
114+
COPY --from=builder --chown=latitude:nodejs /app/packages/core/src/assets/eu-central-1-bundle.pem ./packages/core/src/assets/eu-central-1-bundle.pem
102115

103116
WORKDIR /app/${PROJECT_PATH}
104117

105-
ARG PORT=8080
106-
107-
ENV PORT=$PORT
108-
ENV NODE_ENV=production
109-
110-
EXPOSE $PORT
111-
112118
CMD ["node", "dist/server.js"]
113-

apps/workers/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"lint": "eslint src/",
1212
"start": "node -r module-alias/register ./dist --env=production",
1313
"tc": "tsc --noEmit",
14-
"sentry:sourcemaps": "sentry-cli sourcemaps inject --org latitude-l5 --project latitude-workers ./dist && sentry-cli sourcemaps upload --org latitude-l5 --project latitude-workers ./dist"
14+
"datadog:sourcemaps": "datadog-ci sourcemaps upload dist --service=latitude-workers --minified-path-prefix=/app/apps/workers/dist"
1515
},
1616
"dependencies": {
1717
"@bull-board/api": "6.10.1",
@@ -27,6 +27,7 @@
2727
"express": "4.21.2"
2828
},
2929
"devDependencies": {
30+
"@datadog/datadog-ci": "catalog:",
3031
"@latitude-data/eslint-config": "workspace:^",
3132
"@latitude-data/typescript-config": "workspace:^",
3233
"@types/express": "^4.17.21",

docker-compose.local.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ services:
9494
context: .
9595
dockerfile: apps/websockets/docker/Dockerfile
9696
args:
97-
PROJECT: '@latitude-data/websockets'
97+
PROJECT: '@latitude-data/websockets-server'
9898
PROJECT_PATH: 'apps/websockets'
9999
restart: on-failure
100100
env_file:

0 commit comments

Comments
 (0)