Skip to content

Commit 4a6080a

Browse files
authored
feat: add user-agent with lambda extension version and propagate apm agent info (#404)
* feat: add user-agent with lambda extension version and propagate apm agent info * changelog: add entry
1 parent 3d7aab7 commit 4a6080a

File tree

7 files changed

+23
-2
lines changed

7 files changed

+23
-2
lines changed

CHANGELOG.asciidoc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ https://github.com/elastic/apm-aws-lambda/compare/v1.4.0...main[View commits]
2626
===== Bug fixes
2727
- Log a warning, instead of failing a Lambda function, if auth retrieval from AWS Secrets Manager fails. Reporting APM data will not work, but the Lambda function invocations will proceed. {lambda-pull}401[401]
2828
29+
[float]
30+
===== Features
31+
- Use User-Agent header with Lambda extension version and propagate info from apm agents {lambda-pull}404[404]
32+
2933
[float]
3034
[[lambda-1.4.0]]
3135
=== 1.4.0 - 2023/05/03

accumulator/apmdata.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,5 @@ package accumulator
2323
type APMData struct {
2424
Data []byte
2525
ContentEncoding string
26+
AgentInfo string
2627
}

apmproxy/apmserver.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"time"
3232

3333
"github.com/elastic/apm-aws-lambda/accumulator"
34+
"github.com/elastic/apm-aws-lambda/version"
3435
"go.uber.org/zap"
3536
)
3637

@@ -130,6 +131,7 @@ func (c *Client) PostToApmServer(ctx context.Context, apmData accumulator.APMDat
130131

131132
endpointURI := "intake/v2/events"
132133
encoding := apmData.ContentEncoding
134+
agentInfo := apmData.AgentInfo
133135

134136
var r io.Reader
135137
if apmData.ContentEncoding != "" {
@@ -160,6 +162,7 @@ func (c *Client) PostToApmServer(ctx context.Context, apmData accumulator.APMDat
160162
}
161163
req.Header.Add("Content-Encoding", encoding)
162164
req.Header.Add("Content-Type", "application/x-ndjson")
165+
req.Header.Set("User-Agent", version.UserAgent+" "+agentInfo)
163166
if c.ServerAPIKey != "" {
164167
req.Header.Add("Authorization", "ApiKey "+c.ServerAPIKey)
165168
} else if c.ServerSecretToken != "" {

apmproxy/receiver.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"time"
3030

3131
"github.com/elastic/apm-aws-lambda/accumulator"
32+
"github.com/elastic/apm-aws-lambda/version"
3233
)
3334

3435
const txnRegistrationContentType = "application/vnd.elastic.apm.transaction+ndjson"
@@ -105,6 +106,8 @@ func (c *Client) handleInfoRequest() (func(w http.ResponseWriter, r *http.Reques
105106
r.URL.Host = parsedApmServerURL.Host
106107
r.URL.Scheme = parsedApmServerURL.Scheme
107108
r.Header.Set("X-Forwarded-Host", r.Header.Get("Host"))
109+
reqAgent := r.UserAgent()
110+
r.Header.Set("User-Agent", version.UserAgent+" "+reqAgent)
108111
r.Host = parsedApmServerURL.Host
109112

110113
// Override authorization header sent by the APM agents
@@ -136,6 +139,7 @@ func (c *Client) handleIntakeV2Events() func(w http.ResponseWriter, r *http.Requ
136139
agentData := accumulator.APMData{
137140
Data: rawBytes,
138141
ContentEncoding: r.Header.Get("Content-Encoding"),
142+
AgentInfo: r.UserAgent(),
139143
}
140144

141145
if len(agentData.Data) != 0 {

extension/client.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"net/http"
2626
"time"
2727

28+
"github.com/elastic/apm-aws-lambda/version"
2829
"go.uber.org/zap"
2930
)
3031

@@ -106,6 +107,7 @@ func (e *Client) Register(ctx context.Context, filename string) (*RegisterRespon
106107
return nil, fmt.Errorf("failed to create register request: %w", err)
107108
}
108109
httpReq.Header.Set(extensionNameHeader, filename)
110+
httpReq.Header.Set("User-Agent", version.UserAgent)
109111
httpRes, err := e.httpClient.Do(httpReq)
110112
if err != nil {
111113
return nil, fmt.Errorf("extension register request failed: %w", err)
@@ -134,6 +136,7 @@ func (e *Client) NextEvent(ctx context.Context) (*NextEventResponse, error) {
134136
return nil, fmt.Errorf("failed to create next event request: %w", err)
135137
}
136138
httpReq.Header.Set(extensionIdentiferHeader, e.ExtensionID)
139+
httpReq.Header.Set("User-Agent", version.UserAgent)
137140
httpRes, err := e.httpClient.Do(httpReq)
138141
if err != nil {
139142
return nil, fmt.Errorf("next event request failed: %w", err)
@@ -161,6 +164,7 @@ func (e *Client) InitError(ctx context.Context, errorType string) (*StatusRespon
161164
}
162165
httpReq.Header.Set(extensionIdentiferHeader, e.ExtensionID)
163166
httpReq.Header.Set(extensionErrorType, errorType)
167+
httpReq.Header.Set("User-Agent", version.UserAgent)
164168
httpRes, err := e.httpClient.Do(httpReq)
165169
if err != nil {
166170
return nil, fmt.Errorf("initialization error request failed: %w", err)
@@ -188,6 +192,7 @@ func (e *Client) ExitError(ctx context.Context, errorType string) (*StatusRespon
188192
}
189193
httpReq.Header.Set(extensionIdentiferHeader, e.ExtensionID)
190194
httpReq.Header.Set(extensionErrorType, errorType)
195+
httpReq.Header.Set("User-Agent", version.UserAgent)
191196
httpRes, err := e.httpClient.Do(httpReq)
192197
if err != nil {
193198
return nil, fmt.Errorf("exit error request failed: %w", err)

logsapi/subscribe.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import (
2525
"io"
2626
"net"
2727
"net/http"
28+
29+
"github.com/elastic/apm-aws-lambda/version"
2830
)
2931

3032
// SubscribeRequest is the request body that is sent to Logs API on subscribe
@@ -131,6 +133,7 @@ func (lc *Client) sendRequest(url string, data []byte, extensionID string) (*htt
131133

132134
req.Header.Set("Content-Type", "application/json")
133135
req.Header.Set("Lambda-Extension-Identifier", extensionID)
136+
req.Header.Set("User-Agent", version.UserAgent)
134137

135138
resp, err := lc.httpClient.Do(req)
136139
if err != nil {

extension/version.go renamed to version/version.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18-
package extension
18+
package version
1919

2020
const (
21-
Version = "1.4.0"
21+
Version = "1.4.0"
22+
UserAgent = "apm-aws-lambda/" + Version
2223
)

0 commit comments

Comments
 (0)