elastic-apm 3.7.0 → 3.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ci/Jenkinsfile +139 -96
- data/.ci/packer_cache.sh +12 -10
- data/.rspec +0 -1
- data/CHANGELOG.asciidoc +16 -0
- data/Gemfile +2 -1
- data/bin/run-tests +4 -1
- data/docker-compose.yml +2 -0
- data/docs/configuration.asciidoc +37 -0
- data/lib/elastic_apm/config.rb +4 -8
- data/lib/elastic_apm/grpc.rb +2 -2
- data/lib/elastic_apm/metadata/service_info.rb +5 -2
- data/lib/elastic_apm/opentracing.rb +47 -23
- data/lib/elastic_apm/spies.rb +16 -14
- data/lib/elastic_apm/spies/elasticsearch.rb +16 -2
- data/lib/elastic_apm/spies/mongo.rb +1 -1
- data/lib/elastic_apm/spies/net_http.rb +6 -2
- data/lib/elastic_apm/spies/sequel.rb +1 -1
- data/lib/elastic_apm/transport/filters/hash_sanitizer.rb +77 -0
- data/lib/elastic_apm/transport/filters/secrets_filter.rb +12 -56
- data/lib/elastic_apm/transport/serializers/metadata_serializer.rb +27 -20
- data/lib/elastic_apm/version.rb +1 -1
- metadata +3 -3
- data/.ci/downstreamTests.groovy +0 -192
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 32d176ac5c22246df60ecc92f1baad37011a872af4e64f842b5a43c699a6ced3
|
4
|
+
data.tar.gz: bf0505e728d8f1bd0bb941574a844a8990d14e13a94a7c9f2a6c2d0f9eb5d35b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d57b6bdbc7e78bea95e197d33f3eef4db7a35b23f9e450c636c3c1e3a5dd75ee8ee195709944ac51d6af7a3ab2451fd19d6139f0dedf9e86a4827732d5097f2a
|
7
|
+
data.tar.gz: 924b9bbf782a0fa4e376137e9a44d10cc01be71455ca7614ab1374c70f0926d174eb1078b985cd60c1693e2e0ec1cdd8446502bd40007359262dcc31241250aa
|
data/.ci/Jenkinsfile
CHANGED
@@ -5,14 +5,10 @@ import co.elastic.matrix.*
|
|
5
5
|
import groovy.transform.Field
|
6
6
|
|
7
7
|
/**
|
8
|
-
|
8
|
+
This is the parallel tasks generator,
|
9
|
+
it is need as field to store the results of the tests.
|
9
10
|
*/
|
10
|
-
@Field def
|
11
|
-
|
12
|
-
/**
|
13
|
-
This is required to store the build status for the downstream jobs.
|
14
|
-
*/
|
15
|
-
@Field def rubyDownstreamJobs = [:]
|
11
|
+
@Field def rubyTasksGen
|
16
12
|
|
17
13
|
pipeline {
|
18
14
|
agent { label 'linux && immutable' }
|
@@ -42,7 +38,7 @@ pipeline {
|
|
42
38
|
quietPeriod(10)
|
43
39
|
}
|
44
40
|
triggers {
|
45
|
-
issueCommentTrigger('(?i).*(?:jenkins\\W+)?run\\W+(?:the\\W+)?tests(?:\\W+please)?.*')
|
41
|
+
issueCommentTrigger('(?i).*(?:jenkins\\W+)?run\\W+(?:the\\W+)?(?:benchmark\\W+)?tests(?:\\W+please)?.*')
|
46
42
|
}
|
47
43
|
parameters {
|
48
44
|
booleanParam(name: 'Run_As_Master_Branch', defaultValue: false, description: 'Allow to run any steps on a PR, some steps normally only run on master branch.')
|
@@ -98,50 +94,53 @@ pipeline {
|
|
98
94
|
/**
|
99
95
|
Execute unit tests.
|
100
96
|
*/
|
101
|
-
stage('
|
102
|
-
options { skipDefaultCheckout() }
|
97
|
+
stage('Tests') {
|
103
98
|
when {
|
104
99
|
beforeAgent true
|
105
100
|
expression { return env.ONLY_DOCS == "false" }
|
106
101
|
}
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
parallel(testTasks)
|
102
|
+
failFast false
|
103
|
+
parallel {
|
104
|
+
stage('Tests') {
|
105
|
+
options { skipDefaultCheckout() }
|
106
|
+
steps {
|
107
|
+
withGithubNotify(context: 'Tests', tab: 'tests') {
|
108
|
+
runTests('.ci/.jenkins_framework.yml')
|
109
|
+
}
|
110
|
+
}
|
111
|
+
post {
|
112
|
+
always {
|
113
|
+
convergeCoverage()
|
120
114
|
}
|
121
115
|
}
|
122
116
|
}
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
117
|
+
stage('Master Tests frameworks') {
|
118
|
+
options { skipDefaultCheckout() }
|
119
|
+
steps {
|
120
|
+
catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE', message: "The tests for the master framework have failed. Let's warn instead.") {
|
121
|
+
runTests('.ci/.jenkins_master_framework.yml')
|
122
|
+
}
|
123
|
+
}
|
124
|
+
}
|
125
|
+
stage('Integration Tests') {
|
126
|
+
agent none
|
127
|
+
when {
|
128
|
+
beforeAgent true
|
129
|
+
anyOf {
|
130
|
+
changeRequest()
|
131
|
+
expression { return !params.Run_As_Master_Branch }
|
132
|
+
}
|
133
|
+
}
|
134
|
+
steps {
|
135
|
+
githubNotify(context: "${env.GITHUB_CHECK_ITS_NAME}", description: "${env.GITHUB_CHECK_ITS_NAME} ...", status: 'PENDING', targetUrl: "${env.JENKINS_URL}search/?q=${env.ITS_PIPELINE.replaceAll('/','+')}")
|
136
|
+
build(job: env.ITS_PIPELINE, propagate: false, wait: true,
|
137
|
+
parameters: [ string(name: 'INTEGRATION_TEST', value: 'Ruby'),
|
138
|
+
string(name: 'BUILD_OPTS', value: "--ruby-agent-version ${env.GIT_BASE_COMMIT} --ruby-agent-version-state ${env.GIT_BUILD_CAUSE} --ruby-agent-repo ${env.CHANGE_FORK?.trim() ?: 'elastic'}/${env.REPO} --opbeans-ruby-agent-branch ${env.GIT_BASE_COMMIT}"),
|
139
|
+
string(name: 'GITHUB_CHECK_NAME', value: env.GITHUB_CHECK_ITS_NAME),
|
140
|
+
string(name: 'GITHUB_CHECK_REPO', value: env.REPO),
|
141
|
+
string(name: 'GITHUB_CHECK_SHA1', value: env.GIT_BASE_COMMIT) ])
|
134
142
|
}
|
135
143
|
}
|
136
|
-
}
|
137
|
-
steps {
|
138
|
-
build(job: env.ITS_PIPELINE, propagate: false, wait: false,
|
139
|
-
parameters: [string(name: 'INTEGRATION_TEST', value: 'Ruby'),
|
140
|
-
string(name: 'BUILD_OPTS', value: "--ruby-agent-version ${env.GIT_BASE_COMMIT} --ruby-agent-version-state ${env.GIT_BUILD_CAUSE} --ruby-agent-repo ${env.CHANGE_FORK?.trim() ?: 'elastic'}/${env.REPO} --opbeans-ruby-agent-branch ${env.GIT_BASE_COMMIT}"),
|
141
|
-
string(name: 'GITHUB_CHECK_NAME', value: env.GITHUB_CHECK_ITS_NAME),
|
142
|
-
string(name: 'GITHUB_CHECK_REPO', value: env.REPO),
|
143
|
-
string(name: 'GITHUB_CHECK_SHA1', value: env.GIT_BASE_COMMIT)])
|
144
|
-
githubNotify(context: "${env.GITHUB_CHECK_ITS_NAME}", description: "${env.GITHUB_CHECK_ITS_NAME} ...", status: 'PENDING', targetUrl: "${env.JENKINS_URL}search/?q=${env.ITS_PIPELINE.replaceAll('/','+')}")
|
145
144
|
}
|
146
145
|
}
|
147
146
|
stage('Benchmarks') {
|
@@ -155,6 +154,7 @@ pipeline {
|
|
155
154
|
branch "v\\d?"
|
156
155
|
tag pattern: 'v\\d+.*', comparator: "REGEXP"
|
157
156
|
expression { return params.Run_As_Master_Branch }
|
157
|
+
expression { return env.GITHUB_COMMENT?.contains('benchmark tests') }
|
158
158
|
}
|
159
159
|
expression { return params.bench_ci }
|
160
160
|
}
|
@@ -195,20 +195,6 @@ pipeline {
|
|
195
195
|
}
|
196
196
|
}
|
197
197
|
}
|
198
|
-
stage('Populate Downstream failures') {
|
199
|
-
when {
|
200
|
-
expression { return rubyTasksFailed }
|
201
|
-
}
|
202
|
-
steps {
|
203
|
-
script {
|
204
|
-
def message = 'Failures when running the "Test" stage'
|
205
|
-
if (notifyBuildResult.isAnyDownstreamJobFailedWithTimeout(rubyDownstreamJobs)) {
|
206
|
-
message += ' related to a timeout issue'
|
207
|
-
}
|
208
|
-
error(message)
|
209
|
-
}
|
210
|
-
}
|
211
|
-
}
|
212
198
|
stage('Release') {
|
213
199
|
options { skipDefaultCheckout() }
|
214
200
|
environment {
|
@@ -272,33 +258,14 @@ pipeline {
|
|
272
258
|
}
|
273
259
|
}
|
274
260
|
}
|
275
|
-
stage('Coverage converge') {
|
276
|
-
when {
|
277
|
-
beforeAgent true
|
278
|
-
expression { return env.ONLY_DOCS == "false" }
|
279
|
-
}
|
280
|
-
steps{
|
281
|
-
dir("${BASE_DIR}"){
|
282
|
-
unpack_artifacts(rubyDownstreamJobs)
|
283
|
-
sh(script: "./spec/scripts/coverage_converge.sh")
|
284
|
-
cobertura coberturaReportFile: "coverage/coverage.xml"
|
285
|
-
}
|
286
|
-
}
|
287
|
-
}
|
288
261
|
}
|
289
262
|
post {
|
290
263
|
cleanup {
|
291
|
-
notifyBuildResult(
|
264
|
+
notifyBuildResult()
|
292
265
|
}
|
293
266
|
}
|
294
267
|
}
|
295
268
|
|
296
|
-
def unpack_artifacts(builds) {
|
297
|
-
builds.values().each() { build ->
|
298
|
-
copyArtifacts(projectName: "apm-agent-ruby/apm-agent-ruby-downstream/${env.BRANCH_NAME}", selector: specific(buildNumber: build.number.toString()))
|
299
|
-
}
|
300
|
-
}
|
301
|
-
|
302
269
|
/**
|
303
270
|
Run benchmarks for a Ruby version, then report the results to the Elasticsearch server.
|
304
271
|
*/
|
@@ -337,26 +304,95 @@ def runBenchmark(version){
|
|
337
304
|
}
|
338
305
|
}
|
339
306
|
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
307
|
+
class RubyParallelTaskGenerator extends DefaultParallelTaskGenerator {
|
308
|
+
|
309
|
+
public RubyParallelTaskGenerator(Map params){
|
310
|
+
super(params)
|
311
|
+
}
|
312
|
+
|
313
|
+
/**
|
314
|
+
build a clousure that launch and agent and execute the corresponding test script,
|
315
|
+
then store the results.
|
316
|
+
*/
|
317
|
+
public Closure generateStep(x, y){
|
318
|
+
return {
|
319
|
+
steps.sleep steps.randomNumber(min:10, max: 30)
|
320
|
+
steps.node('linux && immutable'){
|
321
|
+
// Label is transformed to avoid using the internal docker registry in the x coordinate
|
322
|
+
// TODO: def label = "${tag}:${x?.drop(x?.lastIndexOf('/')+1)}#${y}"
|
323
|
+
def label = "${tag}:${x}#${y}"
|
324
|
+
try {
|
325
|
+
steps.runScript(label: label, ruby: x, framework: y)
|
326
|
+
saveResult(x, y, 1)
|
327
|
+
} catch(e){
|
328
|
+
saveResult(x, y, 0)
|
329
|
+
steps.error("${label} tests failed : ${e.toString()}\n")
|
330
|
+
} finally {
|
331
|
+
steps.junit(allowEmptyResults: false,
|
332
|
+
keepLongStdio: true,
|
333
|
+
testResults: "**/spec/junit-reports/**/ruby-agent-junit.xml")
|
334
|
+
steps.dir("${steps.env.BASE_DIR}"){
|
335
|
+
steps.archiveArtifacts(artifacts: 'coverage/matrix_results/', defaultExcludes: false)
|
336
|
+
steps.stash(name: steps.normalise("coverage-${x}-${y}"), includes: 'coverage/matrix_results/', allowEmpty: true)
|
337
|
+
}
|
338
|
+
}
|
339
|
+
}
|
357
340
|
}
|
358
|
-
}
|
359
|
-
|
341
|
+
}
|
342
|
+
}
|
343
|
+
|
344
|
+
/**
|
345
|
+
Run all the tests for the given file with the frameworks to test
|
346
|
+
*/
|
347
|
+
def runTests(frameworkFile) {
|
348
|
+
deleteDir()
|
349
|
+
unstash "source"
|
350
|
+
dir("${BASE_DIR}"){
|
351
|
+
rubyTasksGen = new RubyParallelTaskGenerator(
|
352
|
+
xKey: 'RUBY_VERSION',
|
353
|
+
yKey: 'FRAMEWORK',
|
354
|
+
xFile: ".ci/.jenkins_ruby.yml",
|
355
|
+
yFile: frameworkFile,
|
356
|
+
exclusionFile: ".ci/.jenkins_exclude.yml",
|
357
|
+
tag: "Ruby",
|
358
|
+
name: "Ruby",
|
359
|
+
steps: this
|
360
|
+
)
|
361
|
+
def testTasks = rubyTasksGen.generateParallelTests()
|
362
|
+
parallel(testTasks)
|
363
|
+
}
|
364
|
+
}
|
365
|
+
|
366
|
+
/**
|
367
|
+
Run tests for a Ruby version and framework version.
|
368
|
+
*/
|
369
|
+
def runScript(Map params = [:]){
|
370
|
+
def label = params.label
|
371
|
+
def ruby = params.ruby
|
372
|
+
def framework = params.framework
|
373
|
+
log(level: 'INFO', text: "${label}")
|
374
|
+
retry(2){
|
375
|
+
withEnv(["HOME=${env.WORKSPACE}", "PATH=${env.PATH}:${env.WORKSPACE}/bin"]) {
|
376
|
+
deleteDir()
|
377
|
+
unstash 'source'
|
378
|
+
dir("${BASE_DIR}"){
|
379
|
+
sleep randomNumber(min:10, max: 30)
|
380
|
+
dockerLogin(secret: "${DOCKER_SECRET}", registry: "${DOCKER_REGISTRY}")
|
381
|
+
sh("./spec/scripts/spec.sh ${ruby} ${framework}")
|
382
|
+
}
|
383
|
+
}
|
384
|
+
}
|
385
|
+
}
|
386
|
+
|
387
|
+
def convergeCoverage() {
|
388
|
+
deleteDir()
|
389
|
+
unstash('source')
|
390
|
+
dir("${BASE_DIR}"){
|
391
|
+
rubyTasksGen.dumpMatrix('-')?.each {
|
392
|
+
unstash(normalise("coverage-${it}"))
|
393
|
+
}
|
394
|
+
sh(script: './spec/scripts/coverage_converge.sh')
|
395
|
+
cobertura coberturaReportFile: 'coverage/coverage.xml', onlyStable: false
|
360
396
|
}
|
361
397
|
}
|
362
398
|
|
@@ -374,3 +410,10 @@ def prepareRelease(Closure body){
|
|
374
410
|
}
|
375
411
|
}
|
376
412
|
}
|
413
|
+
|
414
|
+
// Transform the versions like:
|
415
|
+
// - docker.elastic.co/observability-ci/jruby:9.2-12-jdk to jruby-9.2-12-jdk
|
416
|
+
// - jruby:9.1 to jruby-9.1
|
417
|
+
def normalise(def what) {
|
418
|
+
return what.replaceAll('.*/', '').replaceAll(':', '-')
|
419
|
+
}
|
data/.ci/packer_cache.sh
CHANGED
@@ -2,13 +2,15 @@
|
|
2
2
|
|
3
3
|
source /usr/local/bin/bash_standard_lib.sh
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
5
|
+
if [ -x "$(command -v docker)" ]; then
|
6
|
+
grep "-" .ci/.jenkins_ruby.yml | grep -v 'observability-ci' | cut -d'-' -f2- | \
|
7
|
+
while read -r version;
|
8
|
+
do
|
9
|
+
transformedName=${version/:/-}
|
10
|
+
transformedVersion=$(echo "${version}" | cut -d":" -f2)
|
11
|
+
imageName="apm-agent-ruby"
|
12
|
+
registryImageName="docker.elastic.co/observability-ci/${imageName}:${transformedName}"
|
13
|
+
(retry 2 docker pull "${registryImageName}")
|
14
|
+
docker tag "${registryImageName}" "${imageName}:${transformedVersion}"
|
15
|
+
done
|
16
|
+
fi
|
data/.rspec
CHANGED
data/CHANGELOG.asciidoc
CHANGED
@@ -35,7 +35,23 @@ endif::[]
|
|
35
35
|
[[release-notes-3.x]]
|
36
36
|
=== Ruby Agent version 3.x
|
37
37
|
|
38
|
+
[[release-notes-3.8.0]]
|
39
|
+
==== 3.8.0 (2020-06-18)
|
40
|
+
|
41
|
+
[float]
|
42
|
+
===== Added
|
43
|
+
|
44
|
+
- Add the option `capture_elasticsearch_queries` {pull}789[#789]
|
45
|
+
- Add option to skip patching Kernal#require {pull}812[#812]
|
46
|
+
- Add option `service_node_name` {pull}820[#820]
|
47
|
+
|
38
48
|
[float]
|
49
|
+
===== Fixed
|
50
|
+
|
51
|
+
- Allow underscores in hostnames in Net::HTTP spy {pull}804[#804]
|
52
|
+
- Don't change log level on logger object via remote config {pull}809[#809]
|
53
|
+
- Update and fix the Opentracing bridge {pull}791[#791]
|
54
|
+
|
39
55
|
[[release-notes-3.7.0]]
|
40
56
|
==== 3.7.0 (2020-05-14)
|
41
57
|
|
data/Gemfile
CHANGED
@@ -39,7 +39,8 @@ gem 'elasticsearch', require: nil
|
|
39
39
|
gem 'fakeredis', require: nil
|
40
40
|
gem 'faraday', require: nil
|
41
41
|
gem 'graphql', require: nil
|
42
|
-
gem '
|
42
|
+
gem 'google-protobuf', '< 3.12' if !defined?(JRUBY_VERSION) && RUBY_VERSION < '2.5'
|
43
|
+
gem 'grpc' if !defined?(JRUBY_VERSION)
|
43
44
|
gem 'json-schema', require: nil
|
44
45
|
gem 'mongo', require: nil
|
45
46
|
gem 'opentracing', require: nil
|
data/bin/run-tests
CHANGED
@@ -8,7 +8,10 @@ runRspec(){
|
|
8
8
|
if [ -n "${case}" ]; then
|
9
9
|
bn="$(basename ${case} _spec.rb)/"
|
10
10
|
fi
|
11
|
-
bundle exec rspec
|
11
|
+
bundle exec rspec \
|
12
|
+
-f progress \
|
13
|
+
-r yarjuf -f JUnit -o spec/junit-reports/${bn}ruby-agent-junit.xml \
|
14
|
+
${case}
|
12
15
|
}
|
13
16
|
specific_spec=$1
|
14
17
|
|
data/docker-compose.yml
CHANGED
data/docs/configuration.asciidoc
CHANGED
@@ -287,6 +287,16 @@ If your service handles data like this, we advise to only enable this feature wi
|
|
287
287
|
|
288
288
|
Whether or not to attach the request headers to transactions and errors.
|
289
289
|
|
290
|
+
[float]
|
291
|
+
[[config-capture-elasticsearch-queries]]
|
292
|
+
==== `capture_elasticsearch_queries`
|
293
|
+
|============
|
294
|
+
| Environment | `Config` key | Default
|
295
|
+
| `ELASTIC_APM_CAPTURE_ELASTICSEARCH_QUERIES` | `capture_elasticsearch_queries` | `false`
|
296
|
+
|============
|
297
|
+
|
298
|
+
Whether or not to capture the body from requests in Elasticsearch.
|
299
|
+
|
290
300
|
[float]
|
291
301
|
[[config-capture-env]]
|
292
302
|
==== `capture_env`
|
@@ -707,6 +717,23 @@ NOTE: The service name must conform to this regular expression: `^[a-zA-Z0-9 _-]
|
|
707
717
|
In layman's terms: Your service name must only contain characters from the ASCII
|
708
718
|
alphabet, numbers, dashes, underscores and spaces.
|
709
719
|
|
720
|
+
[float]
|
721
|
+
[[config-service-node-name]]
|
722
|
+
==== `service_node_name`
|
723
|
+
|
724
|
+
[options="header"]
|
725
|
+
|============
|
726
|
+
| Environment | `Config` key | Default | Example
|
727
|
+
| `ELASTIC_APM_SERVICE_NODE_NAME` | `service_node_name` | `nil` | `"my-app-1"`
|
728
|
+
|============
|
729
|
+
|
730
|
+
The name of the given service node. This is optional, and if omitted, the APM
|
731
|
+
Server will fall back on `system.container.id` if available, and finally
|
732
|
+
`host.name` if necessary.
|
733
|
+
|
734
|
+
This option allows you to set the node name manually to ensure uniqueness and
|
735
|
+
meaningfulness.
|
736
|
+
|
710
737
|
[float]
|
711
738
|
[[config-service-version]]
|
712
739
|
==== `service_version`
|
@@ -890,3 +917,13 @@ The unit is provided as suffix directly after the number, without any separation
|
|
890
917
|
* `gb` (gigabytes)
|
891
918
|
|
892
919
|
NOTE: we use the power-of-two sizing convention, e.g. `1 kilobyte == 1024 bytes`
|
920
|
+
|
921
|
+
[float]
|
922
|
+
[[special-configuration]]
|
923
|
+
=== Special configuration
|
924
|
+
|
925
|
+
Elastic APM patches `Kernel#require` to auto-detect and instrument supported third party libraries. It does so with the utmost care but in rare cases it can conflict with some libraries.
|
926
|
+
|
927
|
+
To get around this patch, set the environment variable `ELASTIC_APM_SKIP_REQUIRE_PATCH` to `"1"`.
|
928
|
+
|
929
|
+
If you choose to do so, the agent might need some additional tweaking to make sure the third party libraries are picked up and instrumented. Make sure you require the agent _after_ you require your other dependencies.
|