From ecfddc307113b447b9a52d6cf0a055889dc93444 Mon Sep 17 00:00:00 2001 From: "darcy.rayner" Date: Wed, 22 May 2019 17:00:08 -0400 Subject: [PATCH] Update documentation --- README.md | 44 +++++++++++++++++++++++++++------------ ddlambda.go | 4 ++-- internal/trace/context.go | 6 +++--- 3 files changed, 36 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index ab1d1ad7..ca860440 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,49 @@ # dd-lambda-go +Datadog's Lambda Go client library enables distributed tracing between serverful and serverless environments. + +## Installation + +```bash +go get github.com/DataDog/dd-lambda-go +``` + ## Usage -Datadog needs to be able to read headers from the incoming Lambda event, in order to add datadog metadata to the go context. -Wrap your lambda handler like so. +Datadog needs to be able to read headers from the incoming Lambda event. Wrap your Lambda handler function like so: ```go package main import ( - "github.com/aws/aws-lambda-go/lambda" - "github.com/DataDog/dd-lambda-go" + "github.com/aws/aws-lambda-go/lambda" + "github.com/DataDog/dd-lambda-go" ) func main() { - // Wrap your lambda handler like this - lambda.Start( ddlambda.WrapHandler(myHandler)) + // Wrap your lambda handler like this + lambda.Start( ddlambda.WrapHandler(myHandler)) } func myHandler(ctx context.Context, event MyEvent) (string, error) { - // Add headers to outbound using the context object - req, err := http.NewRequest("GET", "http://api.youcompany.com/status") - ddlambda.AddTraceHeaders(ctx) + // ... +} +``` - client := http.Client{} - client.Do(req) +Make sure any outbound requests have Datadog's tracing headers. - return "Success", nil +```go + req, err := http.NewRequest("GET", "http://api.youcompany.com/status") + // Use the same Context object given to your lambda handler. + ddlambda.AddTraceHeaders(ctx, req) + + client := http.Client{} + client.Do(req) } -``` \ No newline at end of file +``` + +## Non-proxy integration + +If your Lambda function is triggered by API Gateway via the non-proxy integration, then you have to set up a mapping template, which passes the Datadog trace context from the incoming HTTP request headers to the Lambda function via the event object. + +If your Lambda function is deployed by the Serverless Framework, such a mapping template gets created by default. \ No newline at end of file diff --git a/ddlambda.go b/ddlambda.go index ca7709e7..0cf94c76 100644 --- a/ddlambda.go +++ b/ddlambda.go @@ -21,8 +21,8 @@ func GetTraceHeaders(ctx context.Context) map[string]string { } // AddTraceHeaders adds DataDog trace headers to a HTTP Request -func AddTraceHeaders(req *http.Request) { - headers := GetTraceHeaders(req.Context()) +func AddTraceHeaders(ctx context.Context, req *http.Request) { + headers := GetTraceHeaders(ctx) for key, value := range headers { req.Header.Add(key, value) } diff --git a/internal/trace/context.go b/internal/trace/context.go index e5bd7aa2..513008bb 100644 --- a/internal/trace/context.go +++ b/internal/trace/context.go @@ -116,7 +116,7 @@ func unmarshalEventForTraceContext(ev json.RawMessage) (map[string]string, bool) func convertTraceContextFromXRay(ctx context.Context) (map[string]string, error) { traceContext := map[string]string{} - header := getLambdaTraceHeaderFromContext(ctx) + header := getXrayTraceHeaderFromContext(ctx) if header == nil { return traceContext, fmt.Errorf("xray segment doesn't exist, couldn't read trace context") } @@ -137,10 +137,10 @@ func convertTraceContextFromXRay(ctx context.Context) (map[string]string, error) return traceContext, nil } -// getLambdaTraceHeaderFromContext is used to extract xray segment metadata from the lambda context object. +// getXrayTraceHeaderFromContext is used to extract xray segment metadata from the lambda context object. // By default, the context object won't have any Segment, (xray.GetSegment(ctx) will return nil). However it // will have the "LambdaTraceHeader" object, which contains the traceID/parentID/sampling info. -func getLambdaTraceHeaderFromContext(ctx context.Context) *header.Header { +func getXrayTraceHeaderFromContext(ctx context.Context) *header.Header { var traceHeader string if traceHeaderValue := ctx.Value(xray.LambdaTraceHeaderKey); traceHeaderValue != nil {