diff --git a/.gitignore b/.gitignore index 740c5435..c3ea6cc5 100644 --- a/.gitignore +++ b/.gitignore @@ -111,3 +111,6 @@ package-lock.json */**/pnpm-lock.yaml .idea/ + +**/client.key +**/client.pem diff --git a/.scripts/copy-shared-files.mjs b/.scripts/copy-shared-files.mjs index 4ca2a97d..e62285e6 100644 --- a/.scripts/copy-shared-files.mjs +++ b/.scripts/copy-shared-files.mjs @@ -17,6 +17,7 @@ const TSCONFIG_EXCLUDE = [ 'production', 'hello-world-js', 'food-delivery', + 'lambda-worker', 'nestjs-exchange-rates', 'empty', 'hello-world', @@ -29,6 +30,7 @@ const GITIGNORE_EXCLUDE = [ 'hello-world-js', 'protobufs', 'food-delivery', + 'lambda-worker', 'nestjs-exchange-rates', ]; const ESLINTRC_EXCLUDE = [ @@ -61,6 +63,7 @@ const POST_CREATE_EXCLUDE = [ 'patching-api', 'signals-queries', 'activities-cancellation-heartbeating', + 'lambda-worker', 'nestjs-exchange-rates', 'food-delivery', 'search-attributes', diff --git a/.scripts/list-of-samples.json b/.scripts/list-of-samples.json index 4812e336..27938381 100644 --- a/.scripts/list-of-samples.json +++ b/.scripts/list-of-samples.json @@ -24,6 +24,7 @@ "hello-world-js", "hello-world-mtls", "interceptors-opentelemetry", + "lambda-worker", "message-passing", "monorepo-folders", "mutex", @@ -51,4 +52,4 @@ "worker-specific-task-queues", "worker-versioning" ] -} \ No newline at end of file +} diff --git a/activities-examples/.npmrc b/activities-examples/.npmrc index 1df92e54..9cf94950 100644 --- a/activities-examples/.npmrc +++ b/activities-examples/.npmrc @@ -1,2 +1 @@ -link-workspace-packages = true -prefer-workspace-packages = true \ No newline at end of file +package-lock=false \ No newline at end of file diff --git a/lambda-worker/.eslintignore b/lambda-worker/.eslintignore new file mode 100644 index 00000000..7bd99a41 --- /dev/null +++ b/lambda-worker/.eslintignore @@ -0,0 +1,3 @@ +node_modules +lib +.eslintrc.js \ No newline at end of file diff --git a/lambda-worker/.eslintrc.js b/lambda-worker/.eslintrc.js new file mode 100644 index 00000000..b8251a06 --- /dev/null +++ b/lambda-worker/.eslintrc.js @@ -0,0 +1,48 @@ +const { builtinModules } = require('module'); + +const ALLOWED_NODE_BUILTINS = new Set(['assert']); + +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, + plugins: ['@typescript-eslint', 'deprecation'], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + 'prettier', + ], + rules: { + // recommended for safety + '@typescript-eslint/no-floating-promises': 'error', // forgetting to await Activities and Workflow APIs is bad + 'deprecation/deprecation': 'warn', + + // code style preference + 'object-shorthand': ['error', 'always'], + + // relaxed rules, for convenience + '@typescript-eslint/no-unused-vars': [ + 'warn', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + }, + ], + '@typescript-eslint/no-explicit-any': 'off', + }, + overrides: [ + { + files: ['src/workflows.ts', 'src/workflows-*.ts', 'src/workflows/*.ts'], + rules: { + 'no-restricted-imports': [ + 'error', + ...builtinModules.filter((m) => !ALLOWED_NODE_BUILTINS.has(m)).flatMap((m) => [m, `node:${m}`]), + ], + }, + }, + ], +}; diff --git a/lambda-worker/.gitignore b/lambda-worker/.gitignore new file mode 100644 index 00000000..67f34e0f --- /dev/null +++ b/lambda-worker/.gitignore @@ -0,0 +1,5 @@ +lib +node_modules +workflow-bundle.js +function.zip +package/ diff --git a/lambda-worker/.npmrc b/lambda-worker/.npmrc new file mode 100644 index 00000000..9cf94950 --- /dev/null +++ b/lambda-worker/.npmrc @@ -0,0 +1 @@ +package-lock=false \ No newline at end of file diff --git a/lambda-worker/.nvmrc b/lambda-worker/.nvmrc new file mode 100644 index 00000000..2bd5a0a9 --- /dev/null +++ b/lambda-worker/.nvmrc @@ -0,0 +1 @@ +22 diff --git a/lambda-worker/.prettierignore b/lambda-worker/.prettierignore new file mode 100644 index 00000000..7951405f --- /dev/null +++ b/lambda-worker/.prettierignore @@ -0,0 +1 @@ +lib \ No newline at end of file diff --git a/lambda-worker/.prettierrc b/lambda-worker/.prettierrc new file mode 100644 index 00000000..965d50bf --- /dev/null +++ b/lambda-worker/.prettierrc @@ -0,0 +1,2 @@ +printWidth: 120 +singleQuote: true diff --git a/lambda-worker/README.md b/lambda-worker/README.md new file mode 100644 index 00000000..c01ff192 --- /dev/null +++ b/lambda-worker/README.md @@ -0,0 +1,131 @@ +# Lambda Worker + +This sample demonstrates how to run a Temporal Worker inside an AWS Lambda function using +the [`@temporalio/lambda-worker`](https://typescript.temporal.io) package. It includes +optional OpenTelemetry instrumentation that exports traces and metrics through AWS Distro +for OpenTelemetry (ADOT). + +The sample registers a simple greeting Workflow and Activity, but the pattern applies to +any Workflow/Activity definitions. + +The sample includes [`@aws-lambda-powertools/logger`](https://docs.aws.amazon.com/powertools/typescript/latest/features/logger/), +which `@temporalio/lambda-worker` automatically detects and uses to produce structured JSON +logs that CloudWatch Logs can parse natively. If you don't need structured logging, you can +remove the dependency and the SDK will fall back to its default human-readable logger. + +> **Note:** `@temporalio/lambda-worker` is not yet published. The `package.json` currently +> references it via a local `file:` path to `../../sdk-node/packages/lambda-worker`. +> TODO: Replace with a versioned dependency (e.g. `^1.15.0`) once the package is published. + +## Prerequisites + +- A [Temporal Cloud](https://temporal.io/cloud) namespace (or a self-hosted Temporal + cluster accessible from your Lambda) +- AWS CLI configured with permissions to create Lambda functions, IAM roles, and + CloudFormation stacks +- mTLS client certificate and key for your Temporal namespace (place as `client.pem` and + `client.key` in this directory) +- Node.js 22+ + +## Files + +| File | Description | +| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | +| `src/index.ts` | Lambda entry point — configures the worker, registers Workflows/Activities, enables OTel, and exports the handler | +| `src/workflows.ts` | Sample Workflow that executes a greeting Activity | +| `src/activities.ts` | Sample Activity that returns a greeting string | +| `src/client.ts` | Helper program to start a Workflow execution from a local machine | +| `src/scripts/build-workflow-bundle.ts` | Pre-bundles Workflow code with OTel interceptor modules for Lambda cold start performance | +| `temporal.toml` | Temporal client connection configuration (update with your namespace) | +| `otel-collector-config.yaml` | OpenTelemetry Collector configuration for ADOT (routes metrics to CloudWatch, traces to X-Ray) | +| `deploy-lambda.sh` | Packages and deploys the Lambda function | +| `mk-iam-role.sh` | Creates the IAM role that allows Temporal Cloud to invoke the Lambda | +| `iam-role-for-temporal-lambda-invoke-test.yaml` | CloudFormation template for the IAM role | +| `extra-setup-steps` | Additional IAM and Lambda configuration for OpenTelemetry support | + +## Setup + +### 1. Configure Temporal connection + +Edit `temporal.toml` with your Temporal Cloud namespace address and credentials. In production, +we'd recommend reading your credentials from a secret store, but to keep this example simple +the toml file defaults to reading them from keys bundled along with the Lambda code. + +### 2. Create the IAM role + +This creates the IAM role that Temporal Cloud assumes to invoke your Lambda function: + +```bash +./mk-iam-role.sh +``` + +The External ID is provided by Temporal Cloud in your namespace's serverless worker +configuration. + +### 3. (Optional) Enable OpenTelemetry + +The sample calls `applyDefaults(config)` in the handler, which registers Temporal SDK +interceptors for tracing Workflow, Activity, and Nexus calls, and configures the Core SDK +to export metrics via OTLP. To complete the setup, attach two ADOT Lambda layers: + +1. **ADOT JavaScript layer** — auto-instruments the handler and exports Node.js-side + traces to X-Ray. See [this page](https://aws-otel.github.io/docs/getting-started/lambda/lambda-js) + for the layer ARN for your region. +2. **ADOT Collector layer** (`aws-otel-collector-amd64`) — runs the OTel Collector as a + Lambda extension, receiving Temporal Core SDK metrics via OTLP and forwarding them to + CloudWatch/X-Ray. See [this page](https://aws-otel.github.io/docs/getting-started/lambda) + for the layer ARN. + +Update `otel-collector-config.yaml` with your function name and region, then set the +following environment variables on your Lambda: + +``` +AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-instrument +OPENTELEMETRY_COLLECTOR_CONFIG_URI=/var/task/otel-collector-config.yaml +``` + +`AWS_LAMBDA_EXEC_WRAPPER` enables the JS layer's auto-instrumentation. +`OPENTELEMETRY_COLLECTOR_CONFIG_URI` points the collector at the custom config that +routes metrics to CloudWatch EMF and traces to X-Ray. + +Enable X-Ray active tracing on the Lambda function (required for traces to appear): + +```bash +aws lambda update-function-configuration --function-name \ + --tracing-config Mode=Active +``` + +Then run the extra setup to grant the Lambda role the necessary permissions: + +```bash +./extra-setup-steps +``` + +### 4. Deploy the Lambda function + +Create a Lambda function in AWS with: + +- **Runtime**: Node.js >=20 +- **Handler**: `index.handler` (the default) +- **Architecture**: x86_64 + +It's likely you will need to increase the default memory limit in AWS for your lambda. A minimum of +256MB is recommended. + +Then deploy: + +```bash +./deploy-lambda.sh +``` + +This compiles TypeScript, pre-bundles Workflow code, packages everything with dependencies, +and uploads to AWS Lambda. + +### 5. Start a Workflow + +Use the starter program to execute a Workflow on the Lambda worker, using +the same config file the Lambda uses for connecting to the server: + +```bash +TEMPORAL_CONFIG_FILE=temporal.toml pnpm workflow +``` diff --git a/lambda-worker/deploy-lambda.sh b/lambda-worker/deploy-lambda.sh new file mode 100755 index 00000000..22b68231 --- /dev/null +++ b/lambda-worker/deploy-lambda.sh @@ -0,0 +1,54 @@ +#!/bin/bash +set -euo pipefail + +FUNCTION_NAME="${1:?Usage: deploy-lambda.sh }" +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +SDK_DIR="$SCRIPT_DIR/../../sdk-node" + +# Build TypeScript +cd "$SCRIPT_DIR" +pnpm build + +# Bundle workflows +pnpm build:workflow-bundle + +# Create packaging directory +rm -rf "$SCRIPT_DIR/package" +mkdir -p "$SCRIPT_DIR/package" + +# Copy compiled JS to package root (so index.js is at zip root for the default handler) +cp "$SCRIPT_DIR/lib/"*.js "$SCRIPT_DIR/package/" + +# Copy workflow bundle alongside the handler +cp "$SCRIPT_DIR/workflow-bundle.js" "$SCRIPT_DIR/package/" + +# Install production dependencies. +# TODO: Once @temporalio/lambda-worker is published, remove the sed and the +# manual copy below — npm install will handle everything. +cd "$SCRIPT_DIR/package" +sed '/@temporalio\/lambda-worker/d' "$SCRIPT_DIR/package.json" > package.json +npm install --omit=dev --ignore-scripts + +# Strip native binaries for platforms other than Lambda's (linux x86_64) +find node_modules/@temporalio/core-bridge/releases -mindepth 1 -maxdepth 1 \ + ! -name 'x86_64-unknown-linux-gnu' -exec rm -rf {} + + +# Manually place the local lambda-worker package (not yet published) +mkdir -p node_modules/@temporalio/lambda-worker +cp "$SDK_DIR/packages/lambda-worker/package.json" node_modules/@temporalio/lambda-worker/ +cp -r "$SDK_DIR/packages/lambda-worker/lib" node_modules/@temporalio/lambda-worker/ + +# Copy config files and certs +cp "$SCRIPT_DIR/temporal.toml" "$SCRIPT_DIR/otel-collector-config.yaml" \ + "$SCRIPT_DIR/client.pem" "$SCRIPT_DIR/client.key" "$SCRIPT_DIR/package/" + +# Create zip +cd "$SCRIPT_DIR/package" +zip -r "$SCRIPT_DIR/function.zip" . + +# Deploy +aws lambda update-function-code --function-name "$FUNCTION_NAME" \ + --zip-file fileb://"$SCRIPT_DIR/function.zip" + +# Cleanup +rm -rf "$SCRIPT_DIR/package" "$SCRIPT_DIR/function.zip" diff --git a/lambda-worker/extra-setup-steps b/lambda-worker/extra-setup-steps new file mode 100755 index 00000000..11493a0f --- /dev/null +++ b/lambda-worker/extra-setup-steps @@ -0,0 +1,48 @@ +#!/bin/bash +set -euo pipefail + +# Additional setup steps for OpenTelemetry support. +# These are needed if you want metrics, logs, and traces from your Lambda worker. + +ROLE_NAME="${1:?Usage: extra-setup-steps }" +FUNCTION_NAME="${2:?Usage: extra-setup-steps }" +REGION="${3:?Usage: extra-setup-steps }" +ACCOUNT_ID="${4:?Usage: extra-setup-steps }" + +# Needed to allow metrics/logs/traces to be published +aws iam put-role-policy \ + --role-name "$ROLE_NAME" \ + --policy-name ADOT-Telemetry-Permissions \ + --policy-document "{ + \"Version\": \"2012-10-17\", + \"Statement\": [ + { + \"Effect\": \"Allow\", + \"Action\": [ + \"logs:CreateLogGroup\", + \"logs:CreateLogStream\", + \"logs:PutLogEvents\" + ], + \"Resource\": \"arn:aws:logs:${REGION}:${ACCOUNT_ID}:log-group:/aws/lambda/${FUNCTION_NAME}:*\" + }, + { + \"Effect\": \"Allow\", + \"Action\": [ + \"xray:PutTraceSegments\", + \"xray:PutTelemetryRecords\" + ], + \"Resource\": \"*\" + }, + { + \"Effect\": \"Allow\", + \"Action\": [ + \"cloudwatch:PutMetricData\" + ], + \"Resource\": \"*\" + } + ] + }" + +# Needed to make traces show up with type: `"AWS::Lambda::Function"` filter +aws lambda update-function-configuration \ + --function-name "$FUNCTION_NAME" --tracing-config Mode=Active diff --git a/lambda-worker/iam-role-for-temporal-lambda-invoke-test.yaml b/lambda-worker/iam-role-for-temporal-lambda-invoke-test.yaml new file mode 100644 index 00000000..bb1cd315 --- /dev/null +++ b/lambda-worker/iam-role-for-temporal-lambda-invoke-test.yaml @@ -0,0 +1,85 @@ +# CloudFormation template for creating an IAM role that Temporal Cloud can assume to invoke Lambda functions. +AWSTemplateFormatVersion: '2010-09-09' +Description: Creates an IAM role that Temporal Cloud can assume to invoke Lambda functions for Serverless Workers. + +Parameters: + AssumeRoleExternalId: + Type: String + Description: The External ID provided by Temporal Cloud + AllowedPattern: '[a-zA-Z0-9_+=,.@-]*' + MinLength: 5 + MaxLength: 45 + + LambdaFunctionARN: + Type: String + Description: >- + The ARN of the Lambda function to invoke + (e.g., arn:aws:lambda:us-west-2:123456789012:function:worker-1) + +Metadata: + AWS::CloudFormation::Interface: + ParameterGroups: + - Label: + default: 'Temporal Cloud Configuration' + Parameters: + - AssumeRoleExternalId + - Label: + default: 'Lambda Configuration' + Parameters: + - LambdaFunctionARN + ParameterLabels: + AssumeRoleExternalId: + default: 'External ID (provided by Temporal Cloud)' + LambdaFunctionARN: + default: 'Lambda Function ARN' + +Resources: + TemporalCloudServerlessWorker: + Type: AWS::IAM::Role + Properties: + RoleName: !Sub + - 'Temporal-Cloud-Serverless-Worker-${LambdaName}' + - LambdaName: !Select [6, !Split [':', !Ref LambdaFunctionARN]] + AssumeRolePolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Principal: + AWS: [arn:aws:iam::031568301006:role/wci-lambda-invoke] + Action: sts:AssumeRole + Condition: + StringEquals: + 'sts:ExternalId': [!Ref AssumeRoleExternalId] + Description: 'The role Temporal Cloud uses to invoke Lambda functions for Serverless Workers' + MaxSessionDuration: 3600 # 1 hour + + TemporalCloudLambdaInvokePermissions: + Type: AWS::IAM::Policy + DependsOn: TemporalCloudServerlessWorker + Properties: + PolicyName: 'Temporal-Cloud-Lambda-Invoke-Permissions' + PolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Action: + - lambda:InvokeFunction + - lambda:GetFunction + Resource: [!Ref LambdaFunctionARN] + Roles: + - !Ref TemporalCloudServerlessWorker + +Outputs: + RoleARN: + Description: The ARN of the IAM role created for Temporal Cloud + Value: !GetAtt TemporalCloudServerlessWorker.Arn + Export: + Name: !Sub '${AWS::StackName}-RoleARN' + + RoleName: + Description: The name of the IAM role + Value: !Ref TemporalCloudServerlessWorker + + LambdaFunctionARN: + Description: The Lambda function ARN that can be invoked + Value: !Ref LambdaFunctionARN diff --git a/lambda-worker/mk-iam-role.sh b/lambda-worker/mk-iam-role.sh new file mode 100755 index 00000000..83afd349 --- /dev/null +++ b/lambda-worker/mk-iam-role.sh @@ -0,0 +1,17 @@ +#!/bin/bash +set -euo pipefail + +# Creates the IAM role that allows Temporal Cloud to invoke your Lambda function. +# You can find the External ID in your Temporal Cloud namespace settings. + +STACK_NAME="${1:?Usage: mk-iam-role.sh }" +EXTERNAL_ID="${2:?Usage: mk-iam-role.sh }" +LAMBDA_ARN="${3:?Usage: mk-iam-role.sh }" + +aws cloudformation create-stack \ + --stack-name "$STACK_NAME" \ + --template-body file://iam-role-for-temporal-lambda-invoke-test.yaml \ + --parameters \ + ParameterKey=AssumeRoleExternalId,ParameterValue="$EXTERNAL_ID" \ + ParameterKey=LambdaFunctionARN,ParameterValue="$LAMBDA_ARN" \ + --capabilities CAPABILITY_NAMED_IAM diff --git a/lambda-worker/otel-collector-config.yaml b/lambda-worker/otel-collector-config.yaml new file mode 100644 index 00000000..4c95314f --- /dev/null +++ b/lambda-worker/otel-collector-config.yaml @@ -0,0 +1,36 @@ +receivers: + otlp: + protocols: + grpc: + endpoint: 'localhost:4317' + http: + endpoint: 'localhost:4318' + +exporters: + debug: + awsxray: + region: us-west-2 + awsemf: + # AWS EMF exporter for metrics + # These are example configurations + namespace: TemporalWorkerMetrics + # log_group_name: /aws/lambda/ + log_group_name: /aws/lambda/sdk-worker-typescript + region: us-west-2 + dimension_rollup_option: NoDimensionRollup + resource_to_telemetry_conversion: + enabled: true + +service: + pipelines: + traces: + receivers: [otlp] + exporters: [awsxray, debug] + metrics: + receivers: [otlp] + exporters: [awsemf] + telemetry: + logs: + level: debug + metrics: + address: localhost:8888 diff --git a/lambda-worker/package.json b/lambda-worker/package.json new file mode 100644 index 00000000..bdd9fee5 --- /dev/null +++ b/lambda-worker/package.json @@ -0,0 +1,41 @@ +{ + "name": "temporal-lambda-worker", + "version": "0.1.0", + "private": true, + "scripts": { + "build": "tsc --build", + "build.watch": "tsc --build --watch", + "build:workflow-bundle": "ts-node src/scripts/build-workflow-bundle.ts", + "format": "prettier --write .", + "format:check": "prettier --check .", + "lint": "eslint .", + "workflow": "ts-node src/client.ts" + }, + "dependencies": { + "@temporalio/activity": "^1.15.0", + "@temporalio/client": "^1.15.0", + "@temporalio/envconfig": "^1.15.0", + "@temporalio/lambda-worker": "file:../../sdk-node/packages/lambda-worker", + "@temporalio/worker": "^1.15.0", + "@temporalio/workflow": "^1.15.0", + "@aws-lambda-powertools/logger": "^2.0.0", + "@temporalio/interceptors-opentelemetry": "^1.15.0", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.52.0", + "@opentelemetry/resources": "^1.25.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1" + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.0", + "@types/aws-lambda": "^8.10.145", + "@types/node": "^22.9.1", + "@typescript-eslint/eslint-plugin": "^8.18.0", + "@typescript-eslint/parser": "^8.18.0", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-deprecation": "^3.0.0", + "prettier": "^3.4.2", + "ts-node": "^10.9.2", + "typescript": "^5.6.3" + } +} diff --git a/lambda-worker/sample.temporal.toml b/lambda-worker/sample.temporal.toml new file mode 100644 index 00000000..a5a60eed --- /dev/null +++ b/lambda-worker/sample.temporal.toml @@ -0,0 +1,6 @@ +[profile.default] +address = "..tmprl.cloud:7233" +namespace = "." +[profile.default.tls] +client_cert_path = "client.pem" +client_key_path = "client.key" diff --git a/lambda-worker/src/activities.ts b/lambda-worker/src/activities.ts new file mode 100644 index 00000000..9a49c50f --- /dev/null +++ b/lambda-worker/src/activities.ts @@ -0,0 +1,6 @@ +import { log } from '@temporalio/activity'; + +export async function helloActivity(name: string): Promise { + log.info('HelloActivity started', { name }); + return `Hello, ${name}!`; +} diff --git a/lambda-worker/src/client.ts b/lambda-worker/src/client.ts new file mode 100644 index 00000000..6f380a8e --- /dev/null +++ b/lambda-worker/src/client.ts @@ -0,0 +1,24 @@ +import { Connection, Client, WorkflowIdConflictPolicy } from '@temporalio/client'; +import { loadClientConnectConfig } from '@temporalio/envconfig'; +import { sampleWorkflow, TASK_QUEUE } from './workflows'; + +async function run() { + const config = loadClientConnectConfig(); + const connection = await Connection.connect(config.connectionOptions); + const client = new Client({ connection, namespace: config.namespace }); + + console.log('Connected to Temporal Service, starting workflow...'); + + const result = await client.workflow.execute(sampleWorkflow, { + taskQueue: TASK_QUEUE, + args: ['Serverless Lambda Worker!'], + workflowId: 'serverless-workflow-id-1', + workflowIdConflictPolicy: WorkflowIdConflictPolicy.TERMINATE_EXISTING, + }); + console.log(`Workflow result: ${result}`); +} + +run().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/lambda-worker/src/index.ts b/lambda-worker/src/index.ts new file mode 100644 index 00000000..f797d324 --- /dev/null +++ b/lambda-worker/src/index.ts @@ -0,0 +1,14 @@ +import { runWorker } from '@temporalio/lambda-worker'; +import { applyDefaults } from '@temporalio/lambda-worker/otel'; +import * as activities from './activities'; +import { TASK_QUEUE } from './workflows'; + +export const handler = runWorker({ deploymentName: 'sdk-demo', buildId: 'v1' }, (config) => { + config.workerOptions.taskQueue = TASK_QUEUE; + config.workerOptions.workflowBundle = { + codePath: require.resolve('./workflow-bundle.js'), + }; + config.workerOptions.activities = activities; + config.workerOptions.workerDeploymentOptions!.defaultVersioningBehavior = 'AUTO_UPGRADE'; + applyDefaults(config); +}); diff --git a/lambda-worker/src/scripts/build-workflow-bundle.ts b/lambda-worker/src/scripts/build-workflow-bundle.ts new file mode 100644 index 00000000..5064446d --- /dev/null +++ b/lambda-worker/src/scripts/build-workflow-bundle.ts @@ -0,0 +1,23 @@ +import { bundleWorkflowCode } from '@temporalio/worker'; +import { makeOtelPlugins } from '@temporalio/lambda-worker/otel'; +import { writeFile } from 'fs/promises'; +import path from 'path'; + +async function bundle() { + // Pass OTel plugins so workflow interceptor modules are included in the bundle. + const plugins = makeOtelPlugins(); + + const { code } = await bundleWorkflowCode({ + workflowsPath: require.resolve('../workflows'), + plugins, + }); + const codePath = path.join(__dirname, '../../workflow-bundle.js'); + + await writeFile(codePath, code); + console.log(`Bundle written to ${codePath}`); +} + +bundle().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/lambda-worker/src/workflows.ts b/lambda-worker/src/workflows.ts new file mode 100644 index 00000000..82a66ff9 --- /dev/null +++ b/lambda-worker/src/workflows.ts @@ -0,0 +1,17 @@ +import { log, proxyActivities, setWorkflowOptions } from '@temporalio/workflow'; +import type * as activities from './activities'; + +const { helloActivity } = proxyActivities({ + startToCloseTimeout: '10 seconds', +}); + +export const TASK_QUEUE = 'serverless-task-queue-typescript'; + +export async function sampleWorkflow(name: string): Promise { + log.info('SampleWorkflow started', { name }); + const result = await helloActivity(name); + log.info('SampleWorkflow completed', { result }); + return result; +} + +setWorkflowOptions({ versioningBehavior: 'AUTO_UPGRADE' }, sampleWorkflow); diff --git a/lambda-worker/temporal.toml b/lambda-worker/temporal.toml new file mode 100644 index 00000000..d6ba4fc8 --- /dev/null +++ b/lambda-worker/temporal.toml @@ -0,0 +1,6 @@ +[profile.default] +address = "ns-sdk-dev-01.temporal-dev.tmprl-test.cloud:7233" +namespace = "ns-sdk-dev-01.temporal-dev" +[profile.default.tls] +client_cert_path = "client.pem" +client_key_path = "client.key" diff --git a/lambda-worker/tsconfig.json b/lambda-worker/tsconfig.json new file mode 100644 index 00000000..488f2c62 --- /dev/null +++ b/lambda-worker/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "version": "5.6.3", + "compilerOptions": { + "lib": ["es2021"], + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "./src", + "outDir": "./lib" + }, + "include": ["src/**/*.ts"] +} diff --git a/package.json b/package.json index eb963758..07da6e4b 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,11 @@ "zx": "^8.2.4" }, "pnpm": { + "overrides": { + "@temporalio/lambda-worker>@temporalio/common": "^1.15.0", + "@temporalio/lambda-worker>@temporalio/envconfig": "^1.15.0", + "@temporalio/lambda-worker>@temporalio/worker": "^1.15.0" + }, "packageExtensions": { "eslint-config-next": { "peerDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4d3bbee0..e1d367f6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,11 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@temporalio/lambda-worker>@temporalio/common': ^1.15.0 + '@temporalio/lambda-worker>@temporalio/envconfig': ^1.15.0 + '@temporalio/lambda-worker>@temporalio/worker': ^1.15.0 + packageExtensionsChecksum: sha256-RSsb6d/Rd8pXhdhSBzrPSOhVUv6Qo/SaIv70LvTVxoA= importers: @@ -1837,6 +1842,79 @@ importers: specifier: ^5.6.3 version: 5.7.3 + lambda-worker: + dependencies: + '@aws-lambda-powertools/logger': + specifier: ^2.0.0 + version: 2.33.0 + '@opentelemetry/exporter-trace-otlp-grpc': + specifier: ^0.52.0 + version: 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': + specifier: ^1.25.1 + version: 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': + specifier: ^1.25.1 + version: 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': + specifier: ^1.25.1 + version: 1.28.0 + '@temporalio/activity': + specifier: ^1.15.0 + version: 1.15.0 + '@temporalio/client': + specifier: ^1.15.0 + version: 1.15.0 + '@temporalio/envconfig': + specifier: ^1.15.0 + version: 1.15.0 + '@temporalio/interceptors-opentelemetry': + specifier: ^1.15.0 + version: 1.15.0(@temporalio/common@1.15.0)(@temporalio/workflow@1.15.0) + '@temporalio/lambda-worker': + specifier: file:../../sdk-node/packages/lambda-worker + version: file:../sdk-node/packages/lambda-worker(@aws-lambda-powertools/logger@2.33.0)(@opentelemetry/exporter-trace-otlp-grpc@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@swc/helpers@0.5.15)(@temporalio/interceptors-opentelemetry@1.15.0(@temporalio/common@1.15.0)(@temporalio/workflow@1.15.0)) + '@temporalio/worker': + specifier: ^1.15.0 + version: 1.15.0(@swc/helpers@0.5.15) + '@temporalio/workflow': + specifier: ^1.15.0 + version: 1.15.0 + devDependencies: + '@tsconfig/node22': + specifier: ^22.0.0 + version: 22.0.5 + '@types/aws-lambda': + specifier: ^8.10.145 + version: 8.10.161 + '@types/node': + specifier: ^22.9.1 + version: 22.12.0 + '@typescript-eslint/eslint-plugin': + specifier: ^8.18.0 + version: 8.22.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/parser': + specifier: ^8.18.0 + version: 8.22.0(eslint@8.57.1)(typescript@5.7.3) + eslint: + specifier: ^8.57.1 + version: 8.57.1 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.1) + eslint-plugin-deprecation: + specifier: ^3.0.0 + version: 3.0.0(eslint@8.57.1)(typescript@5.7.3) + prettier: + specifier: ^3.4.2 + version: 3.4.2 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.10.11(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3) + typescript: + specifier: ^5.6.3 + version: 5.7.3 + message-passing/execute-update: dependencies: '@temporalio/activity': @@ -3718,6 +3796,24 @@ packages: peerDependencies: ajv: '>=8' + '@aws-lambda-powertools/commons@2.33.0': + resolution: {integrity: sha512-cXGfWT4FXtLO7Ny/shep6V/xYzgVN7hvukOA0bTa4nlg2GWiQsPoBoKvCEcfQ9I8GIS0tPyDfRkdx80SvA7LpA==} + + '@aws-lambda-powertools/logger@2.33.0': + resolution: {integrity: sha512-ejkgit7O8yrhu5Mbx8fBAd3lykBNtYsVzFSR653Sh3d8ojpp8zo2OoARt3lKEK4cjHsKB/kUGbpzZcSYkR6Hvg==} + peerDependencies: + '@aws-lambda-powertools/jmespath': 2.33.0 + '@middy/core': 4.x || 5.x || 6.x || 7.x + peerDependenciesMeta: + '@aws-lambda-powertools/jmespath': + optional: true + '@middy/core': + optional: true + + '@aws/lambda-invoke-store@0.2.4': + resolution: {integrity: sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==} + engines: {node: '>=18.0.0'} + '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -5619,6 +5715,10 @@ packages: engines: {node: '>=8.0.0', npm: '>=5.0.0'} hasBin: true + '@opentelemetry/api-logs@0.52.1': + resolution: {integrity: sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==} + engines: {node: '>=14'} + '@opentelemetry/api-logs@0.57.1': resolution: {integrity: sha512-I4PHczeujhQAQv6ZBzqHYEUiggZL4IdSMixtVD3EYqbdrjujE7kRfI5QohjlPoJm8BvenoW5YaTMWRrbpot6tg==} engines: {node: '>=14'} @@ -5643,6 +5743,12 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/core@1.25.1': + resolution: {integrity: sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/core@1.30.1': resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} engines: {node: '>=14'} @@ -5691,6 +5797,12 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/exporter-trace-otlp-grpc@0.52.1': + resolution: {integrity: sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@opentelemetry/exporter-trace-otlp-grpc@0.57.2': resolution: {integrity: sha512-gHU1vA3JnHbNxEXg5iysqCWxN9j83d7/epTYBZflqQnTyCC4N7yZXn/dMM+bEmyhQPGjhCkNZLx4vZuChH1PYw==} engines: {node: '>=14'} @@ -5961,18 +6073,36 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/otlp-exporter-base@0.52.1': + resolution: {integrity: sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@opentelemetry/otlp-exporter-base@0.57.2': resolution: {integrity: sha512-XdxEzL23Urhidyebg5E6jZoaiW5ygP/mRjxLHixogbqwDy2Faduzb5N0o/Oi+XTIJu+iyxXdVORjXax+Qgfxag==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/otlp-grpc-exporter-base@0.52.1': + resolution: {integrity: sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@opentelemetry/otlp-grpc-exporter-base@0.57.2': resolution: {integrity: sha512-USn173KTWy0saqqRB5yU9xUZ2xdgb1Rdu5IosJnm9aV4hMTuFFRTUsQxbgc24QxpCHeoKzzCSnS/JzdV0oM2iQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/otlp-transformer@0.52.1': + resolution: {integrity: sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/otlp-transformer@0.57.2': resolution: {integrity: sha512-48IIRj49gbQVK52jYsw70+Jv+JbahT8BqT2Th7C4H7RCM9d0gZ5sgNPoMpWldmfjvIsSgiGJtjfk9MeZvjhoig==} engines: {node: '>=14'} @@ -6031,18 +6161,36 @@ packages: peerDependencies: '@opentelemetry/api': ^1.0.0 + '@opentelemetry/resources@1.25.1': + resolution: {integrity: sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/resources@1.30.1': resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/sdk-logs@0.52.1': + resolution: {integrity: sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + '@opentelemetry/sdk-logs@0.57.2': resolution: {integrity: sha512-TXFHJ5c+BKggWbdEQ/inpgIzEmS2BGQowLE9UhsMd7YYlUfBQJ4uax0VF/B5NYigdM/75OoJGhAV3upEhK+3gg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.4.0 <1.10.0' + '@opentelemetry/sdk-metrics@1.25.1': + resolution: {integrity: sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/sdk-metrics@1.30.1': resolution: {integrity: sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==} engines: {node: '>=14'} @@ -6055,6 +6203,12 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/sdk-trace-base@1.25.1': + resolution: {integrity: sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/sdk-trace-base@1.30.1': resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} engines: {node: '>=14'} @@ -6067,6 +6221,10 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/semantic-conventions@1.25.1': + resolution: {integrity: sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==} + engines: {node: '>=14'} + '@opentelemetry/semantic-conventions@1.27.0': resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} engines: {node: '>=14'} @@ -6556,6 +6714,27 @@ packages: '@temporalio/workflow': optional: true + '@temporalio/lambda-worker@file:../sdk-node/packages/lambda-worker': + resolution: {directory: ../sdk-node/packages/lambda-worker, type: directory} + engines: {node: '>= 20.0.0'} + peerDependencies: + '@aws-lambda-powertools/logger': ^2.0.0 + '@opentelemetry/exporter-trace-otlp-grpc': ^0.52.0 + '@opentelemetry/resources': ^1.25.1 + '@opentelemetry/sdk-trace-base': ^1.25.1 + '@temporalio/interceptors-opentelemetry': workspace:* + peerDependenciesMeta: + '@aws-lambda-powertools/logger': + optional: true + '@opentelemetry/exporter-trace-otlp-grpc': + optional: true + '@opentelemetry/resources': + optional: true + '@opentelemetry/sdk-trace-base': + optional: true + '@temporalio/interceptors-opentelemetry': + optional: true + '@temporalio/nexus@1.15.0': resolution: {integrity: sha512-E6CdIjskkbK2aObxcb76Z4V3o1D3QDxEtsxmuHX5D7HEABuYGdV+oeOzDyxMlfeY9GyIM9Nvky4XCiSz2h2XRA==} engines: {node: '>= 20.0.0'} @@ -6686,6 +6865,9 @@ packages: '@types/aws-lambda@8.10.143': resolution: {integrity: sha512-u5vzlcR14ge/4pMTTMDQr3MF0wEe38B2F9o84uC4F43vN5DGTy63npRrB6jQhyt+C0lGv4ZfiRcRkqJoZuPnmg==} + '@types/aws-lambda@8.10.161': + resolution: {integrity: sha512-rUYdp+MQwSFocxIOcSsYSF3YYYC/uUpMbCY/mbO21vGqfrEYvNSoPyKYDj6RhXXpPfS0KstW9RwG3qXh9sL7FQ==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -14980,6 +15162,17 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 + '@aws-lambda-powertools/commons@2.33.0': + dependencies: + '@aws/lambda-invoke-store': 0.2.4 + + '@aws-lambda-powertools/logger@2.33.0': + dependencies: + '@aws-lambda-powertools/commons': 2.33.0 + '@aws/lambda-invoke-store': 0.2.4 + + '@aws/lambda-invoke-store@0.2.4': {} + '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -17115,6 +17308,10 @@ snapshots: transitivePeerDependencies: - encoding + '@opentelemetry/api-logs@0.52.1': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs@0.57.1': dependencies: '@opentelemetry/api': 1.9.0 @@ -17183,6 +17380,11 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 + '@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.25.1 + '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -17256,6 +17458,16 @@ snapshots: '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-grpc@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.12.5 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-grpc@0.57.2(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.12.5 @@ -17652,12 +17864,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/otlp-exporter-base@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base@0.57.2(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.12.5 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base@0.57.2(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.12.5 @@ -17666,6 +17892,17 @@ snapshots: '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + protobufjs: 7.4.0 + '@opentelemetry/otlp-transformer@0.57.2(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -17732,12 +17969,25 @@ snapshots: - encoding - supports-color + '@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 + '@opentelemetry/sdk-logs@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs@0.57.2(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -17745,6 +17995,13 @@ snapshots: '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + lodash.merge: 4.6.2 + '@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -17777,6 +18034,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -17794,6 +18058,8 @@ snapshots: '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) semver: 7.6.3 + '@opentelemetry/semantic-conventions@1.25.1': {} + '@opentelemetry/semantic-conventions@1.27.0': {} '@opentelemetry/semantic-conventions@1.28.0': {} @@ -18220,6 +18486,23 @@ snapshots: optionalDependencies: '@temporalio/workflow': 1.15.0 + '@temporalio/lambda-worker@file:../sdk-node/packages/lambda-worker(@aws-lambda-powertools/logger@2.33.0)(@opentelemetry/exporter-trace-otlp-grpc@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@swc/helpers@0.5.15)(@temporalio/interceptors-opentelemetry@1.15.0(@temporalio/common@1.15.0)(@temporalio/workflow@1.15.0))': + dependencies: + '@temporalio/common': 1.15.0 + '@temporalio/envconfig': 1.15.0 + '@temporalio/worker': 1.15.0(@swc/helpers@0.5.15) + optionalDependencies: + '@aws-lambda-powertools/logger': 2.33.0 + '@opentelemetry/exporter-trace-otlp-grpc': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@temporalio/interceptors-opentelemetry': 1.15.0(@temporalio/common@1.15.0)(@temporalio/workflow@1.15.0) + transitivePeerDependencies: + - '@swc/helpers' + - esbuild + - uglify-js + - webpack-cli + '@temporalio/nexus@1.15.0': dependencies: '@temporalio/client': 1.15.0 @@ -18418,6 +18701,8 @@ snapshots: '@types/aws-lambda@8.10.143': {} + '@types/aws-lambda@8.10.161': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.26.7