elastic-apm 2.8.1 → 2.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/.ci/.jenkins_codecov.yml +5 -0
  3. data/.ci/.jenkins_exclude.yml +63 -0
  4. data/.ci/.jenkins_framework.yml +9 -0
  5. data/.ci/.jenkins_master_framework.yml +3 -0
  6. data/.ci/.jenkins_ruby.yml +11 -0
  7. data/.ci/Jenkinsfile +268 -0
  8. data/.ci/bin/check_paths_for_matches.py +80 -0
  9. data/.ci/downstreamTests.groovy +188 -0
  10. data/.ci/jobs/apm-agent-ruby-downstream.yml +37 -0
  11. data/.ci/jobs/apm-agent-ruby-linting-mbp.yml +38 -0
  12. data/.ci/jobs/apm-agent-ruby-mbp.yml +41 -0
  13. data/.ci/jobs/apm-agent-ruby.yml +4 -0
  14. data/.ci/jobs/defaults.yml +24 -0
  15. data/.ci/linting.groovy +32 -0
  16. data/.ci/prepare-git-context.sh +23 -0
  17. data/.pre-commit-config.yaml +22 -0
  18. data/.rspec +0 -1
  19. data/.rubocop.yml +3 -3
  20. data/CHANGELOG.md +59 -2
  21. data/docs/api.asciidoc +24 -7
  22. data/docs/configuration.asciidoc +43 -4
  23. data/docs/index.asciidoc +2 -0
  24. data/docs/log-correlation.asciidoc +96 -0
  25. data/docs/metrics.asciidoc +77 -6
  26. data/lib/elastic_apm.rb +37 -5
  27. data/lib/elastic_apm/agent.rb +29 -4
  28. data/lib/elastic_apm/central_config.rb +141 -0
  29. data/lib/elastic_apm/central_config/cache_control.rb +34 -0
  30. data/lib/elastic_apm/config.rb +165 -340
  31. data/lib/elastic_apm/config/bytes.rb +25 -0
  32. data/lib/elastic_apm/config/duration.rb +6 -8
  33. data/lib/elastic_apm/config/options.rb +134 -0
  34. data/lib/elastic_apm/config/regexp_list.rb +13 -0
  35. data/lib/elastic_apm/context_builder.rb +2 -0
  36. data/lib/elastic_apm/error/exception.rb +3 -1
  37. data/lib/elastic_apm/error_builder.rb +6 -3
  38. data/lib/elastic_apm/instrumenter.rb +6 -0
  39. data/lib/elastic_apm/metadata.rb +2 -1
  40. data/lib/elastic_apm/metrics.rb +2 -1
  41. data/lib/elastic_apm/metrics/vm.rb +60 -0
  42. data/lib/elastic_apm/normalizers/action_controller.rb +5 -2
  43. data/lib/elastic_apm/normalizers/action_mailer.rb +5 -2
  44. data/lib/elastic_apm/normalizers/action_view.rb +14 -9
  45. data/lib/elastic_apm/normalizers/active_record.rb +5 -2
  46. data/lib/elastic_apm/rails.rb +59 -0
  47. data/lib/elastic_apm/railtie.rb +11 -48
  48. data/lib/elastic_apm/span.rb +29 -7
  49. data/lib/elastic_apm/spies/faraday.rb +9 -2
  50. data/lib/elastic_apm/spies/http.rb +9 -2
  51. data/lib/elastic_apm/spies/mongo.rb +18 -3
  52. data/lib/elastic_apm/spies/net_http.rb +8 -2
  53. data/lib/elastic_apm/stacktrace/frame.rb +3 -1
  54. data/lib/elastic_apm/stacktrace_builder.rb +2 -2
  55. data/lib/elastic_apm/subscriber.rb +11 -3
  56. data/lib/elastic_apm/transport/connection.rb +17 -3
  57. data/lib/elastic_apm/transport/connection/proxy_pipe.rb +8 -1
  58. data/lib/elastic_apm/transport/filters/secrets_filter.rb +3 -1
  59. data/lib/elastic_apm/transport/serializers/error_serializer.rb +12 -2
  60. data/lib/elastic_apm/transport/serializers/metadata_serializer.rb +6 -1
  61. data/lib/elastic_apm/transport/serializers/span_serializer.rb +11 -3
  62. data/lib/elastic_apm/version.rb +1 -1
  63. metadata +26 -4
  64. data/Jenkinsfile +0 -280
  65. data/lib/elastic_apm/config/size.rb +0 -28
@@ -0,0 +1,188 @@
1
+ #!/usr/bin/env groovy
2
+ @Library('apm@current') _
3
+
4
+ import co.elastic.matrix.*
5
+ import groovy.transform.Field
6
+
7
+ /**
8
+ This is the parallel tasks generator,
9
+ it is need as field to store the results of the tests.
10
+ */
11
+ @Field def rubyTasksGen
12
+
13
+ pipeline {
14
+ agent { label 'linux && immutable' }
15
+ environment {
16
+ REPO="git@github.com:elastic/apm-agent-ruby.git"
17
+ BASE_DIR="src/github.com/elastic/apm-agent-ruby"
18
+ PIPELINE_LOG_LEVEL='INFO'
19
+ NOTIFY_TO = credentials('notify-to')
20
+ JOB_GCS_BUCKET = credentials('gcs-bucket')
21
+ JOB_GIT_CREDENTIALS = "f6c7695a-671e-4f4f-a331-acdce44ff9ba"
22
+ DOCKER_REGISTRY = 'docker.elastic.co'
23
+ DOCKER_SECRET = 'secret/apm-team/ci/docker-registry/prod'
24
+ CODECOV_SECRET = 'secret/apm-team/ci/apm-agent-ruby-codecov'
25
+ }
26
+ options {
27
+ timeout(time: 2, unit: 'HOURS')
28
+ buildDiscarder(logRotator(numToKeepStr: '300', artifactNumToKeepStr: '20', daysToKeepStr: '30'))
29
+ timestamps()
30
+ ansiColor('xterm')
31
+ disableResume()
32
+ durabilityHint('PERFORMANCE_OPTIMIZED')
33
+ rateLimitBuilds(throttle: [count: 60, durationName: 'hour', userBoost: true])
34
+ quietPeriod(10)
35
+ }
36
+ parameters {
37
+ string(name: 'RUBY_VERSION', defaultValue: "ruby:2.6", description: "Ruby version to test")
38
+ string(name: 'BRANCH_SPECIFIER', defaultValue: "master", description: "Git branch/tag to use")
39
+ }
40
+ stages {
41
+ /**
42
+ Checkout the code and stash it, to use it on other stages.
43
+ */
44
+ stage('Checkout') {
45
+ agent { label 'immutable' }
46
+ options { skipDefaultCheckout() }
47
+ steps {
48
+ deleteDir()
49
+ gitCheckout(basedir: "${BASE_DIR}",
50
+ branch: "${params.BRANCH_SPECIFIER}",
51
+ repo: "${REPO}",
52
+ credentialsId: "${JOB_GIT_CREDENTIALS}")
53
+ stash allowEmpty: true, name: 'source', useDefaultExcludes: false
54
+ }
55
+ }
56
+ stage('Test') {
57
+ agent { label 'linux && immutable' }
58
+ options { skipDefaultCheckout() }
59
+ steps {
60
+ runTests('.ci/.jenkins_framework.yml')
61
+ }
62
+ }
63
+ stage('Master Test') {
64
+ agent { label 'linux && immutable' }
65
+ options { skipDefaultCheckout() }
66
+ steps {
67
+ catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE', message: "The tests for the master framework have failed. Let's warn instead.") {
68
+ runTests('.ci/.jenkins_master_framework.yml')
69
+ }
70
+ }
71
+ }
72
+ }
73
+ post {
74
+ cleanup {
75
+ script{
76
+ if(rubyTasksGen?.results){
77
+ writeJSON(file: 'results.json', json: toJSON(rubyTasksGen.results), pretty: 2)
78
+ def mapResults = ["Ruby": rubyTasksGen.results]
79
+ def processor = new ResultsProcessor()
80
+ processor.processResults(mapResults)
81
+ archiveArtifacts allowEmptyArchive: true, artifacts: 'results.json,results.html', defaultExcludes: false
82
+ catchError(buildResult: 'SUCCESS') {
83
+ def datafile = readFile(file: "results.json")
84
+ def json = getVaultSecret(secret: 'secret/apm-team/ci/jenkins-stats-cloud')
85
+ sendDataToElasticsearch(es: json.data.url, data: datafile, restCall: '/jenkins-builds-ruby-test-results/_doc/')
86
+ }
87
+ }
88
+ }
89
+ notifyBuildResult()
90
+ }
91
+ }
92
+ }
93
+
94
+ /**
95
+ Parallel task generator for the integration tests.
96
+ */
97
+ class RubyParallelTaskGenerator extends DefaultParallelTaskGenerator {
98
+
99
+ public RubyParallelTaskGenerator(Map params){
100
+ super(params)
101
+ }
102
+
103
+ /**
104
+ build a clousure that launch and agent and execute the corresponding test script,
105
+ then store the results.
106
+ */
107
+ public Closure generateStep(x, y){
108
+ return {
109
+ steps.sleep steps.randomNumber(min:10, max: 30)
110
+ steps.node('linux && immutable'){
111
+ // Label is transformed to avoid using the internal docker registry in the x coordinate
112
+ // TODO: def label = "${tag}:${x?.drop(x?.lastIndexOf('/')+1)}#${y}"
113
+ def label = "${tag}:${x}#${y}"
114
+ try {
115
+ steps.runScript(label: label, ruby: x, framework: y)
116
+ saveResult(x, y, 1)
117
+ } catch(e){
118
+ saveResult(x, y, 0)
119
+ steps.error("${label} tests failed : ${e.toString()}\n")
120
+ } finally {
121
+ steps.junit(allowEmptyResults: true,
122
+ keepLongStdio: true,
123
+ testResults: "**/spec/ruby-agent-junit.xml")
124
+ if (steps.isCodecovEnabled(x, y)) {
125
+ steps.codecov(repo: "${steps.env.REPO}", basedir: "${steps.env.BASE_DIR}",
126
+ secret: "${steps.env.CODECOV_SECRET}")
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+
134
+ /**
135
+ Run tests for a Ruby version and framework version.
136
+ */
137
+ def runScript(Map params = [:]){
138
+ def label = params.label
139
+ def ruby = params.ruby
140
+ def framework = params.framework
141
+ log(level: 'INFO', text: "${label}")
142
+ env.HOME = "${env.WORKSPACE}"
143
+ env.PATH = "${env.PATH}:${env.WORKSPACE}/bin"
144
+ deleteDir()
145
+ unstash 'source'
146
+ dir("${BASE_DIR}"){
147
+ retry(2){
148
+ sleep randomNumber(min:10, max: 30)
149
+ dockerLogin(secret: "${DOCKER_SECRET}", registry: "${DOCKER_REGISTRY}")
150
+ sh("./spec/scripts/spec.sh ${ruby} ${framework}")
151
+ }
152
+ }
153
+ }
154
+
155
+ /**
156
+ * Whether the given ruby version and framework are in charge of sending the
157
+ * codecov results. It does require the workspace.
158
+ */
159
+ def isCodecovEnabled(ruby, framework){
160
+ dir(BASE_DIR){
161
+ def codecovVersions = readYaml(file: '.ci/.jenkins_codecov.yml')
162
+ return codecovVersions['ENABLED'].any { it.trim() == "${ruby?.trim()}#${framework?.trim()}" }
163
+ }
164
+ }
165
+
166
+ /**
167
+ Run all the tests for the given ruby version and file with the frameworks to test
168
+ */
169
+ def runTests(frameworkFile) {
170
+ deleteDir()
171
+ unstash "source"
172
+ dir("${BASE_DIR}"){
173
+ script {
174
+ rubyTasksGen = new RubyParallelTaskGenerator(
175
+ xVersions: [ "${params.RUBY_VERSION}" ],
176
+ xKey: 'RUBY_VERSION',
177
+ yKey: 'FRAMEWORK',
178
+ yFile: frameworkFile,
179
+ exclusionFile: '.ci/.jenkins_exclude.yml',
180
+ tag: 'Ruby',
181
+ name: 'Ruby',
182
+ steps: this
183
+ )
184
+ def mapPatallelTasks = rubyTasksGen.generateParallelTests()
185
+ parallel(mapPatallelTasks)
186
+ }
187
+ }
188
+ }
@@ -0,0 +1,37 @@
1
+ ---
2
+ - job:
3
+ name: apm-agent-ruby/apm-agent-ruby-downstream
4
+ display-name: APM Agent Ruby Downstream
5
+ description: APM Agent Ruby Downstream .
6
+ script-path: .ci/downstreamTests.groovy
7
+ scm:
8
+ - github:
9
+ branch-discovery: no-pr
10
+ discover-pr-forks-strategy: merge-current
11
+ discover-pr-forks-trust: permission
12
+ discover-pr-origin: merge-current
13
+ discover-tags: true
14
+ notification-context: 'apm-ci/downstream'
15
+ property-strategies:
16
+ all-branches:
17
+ - suppress-scm-triggering: true
18
+ repo: apm-agent-ruby
19
+ repo-owner: elastic
20
+ credentials-id: 2a9602aa-ab9f-4e52-baf3-b71ca88469c7-UserAndToken
21
+ ssh-checkout:
22
+ credentials: f6c7695a-671e-4f4f-a331-acdce44ff9ba
23
+ clean:
24
+ after: true
25
+ before: true
26
+ prune: true
27
+ shallow-clone: true
28
+ depth: 3
29
+ do-not-fetch-tags: true
30
+ submodule:
31
+ disable: false
32
+ recursive: true
33
+ parent-credentials: true
34
+ timeout: 100
35
+ timeout: '15'
36
+ use-author: true
37
+ wipe-workspace: 'True'
@@ -0,0 +1,38 @@
1
+ ---
2
+ - job:
3
+ name: apm-agent-ruby/apm-agent-ruby-linting-mbp
4
+ display-name: APM Agent Ruby Linting
5
+ description: APM Agent Ruby Linting
6
+ script-path: .ci/linting.groovy
7
+ scm:
8
+ - github:
9
+ branch-discovery: no-pr
10
+ discover-pr-forks-strategy: merge-current
11
+ discover-pr-forks-trust: permission
12
+ discover-pr-origin: merge-current
13
+ discover-tags: false
14
+ notification-context: 'apm-ci/linting'
15
+ head-filter-regex: '^PR-.*$'
16
+ repo: apm-agent-ruby
17
+ repo-owner: elastic
18
+ credentials-id: 2a9602aa-ab9f-4e52-baf3-b71ca88469c7-UserAndToken
19
+ ssh-checkout:
20
+ credentials: f6c7695a-671e-4f4f-a331-acdce44ff9ba
21
+ build-strategies:
22
+ - change-request:
23
+ ignore-target-only-changes: false
24
+ clean:
25
+ after: true
26
+ before: true
27
+ prune: true
28
+ shallow-clone: true
29
+ depth: 3
30
+ do-not-fetch-tags: true
31
+ submodule:
32
+ disable: false
33
+ recursive: true
34
+ parent-credentials: true
35
+ timeout: 100
36
+ timeout: '15'
37
+ use-author: true
38
+ wipe-workspace: 'True'
@@ -0,0 +1,41 @@
1
+ ---
2
+ - job:
3
+ name: apm-agent-ruby/apm-agent-ruby-mbp
4
+ display-name: APM Agent Ruby
5
+ description: APM Agent Ruby
6
+ script-path: .ci/Jenkinsfile
7
+ scm:
8
+ - github:
9
+ branch-discovery: no-pr
10
+ discover-pr-forks-strategy: merge-current
11
+ discover-pr-forks-trust: permission
12
+ discover-pr-origin: merge-current
13
+ discover-tags: true
14
+ notification-context: 'apm-ci'
15
+ repo: apm-agent-ruby
16
+ repo-owner: elastic
17
+ credentials-id: 2a9602aa-ab9f-4e52-baf3-b71ca88469c7-UserAndToken
18
+ ssh-checkout:
19
+ credentials: f6c7695a-671e-4f4f-a331-acdce44ff9ba
20
+ build-strategies:
21
+ - tags:
22
+ ignore-tags-older-than: -1
23
+ ignore-tags-newer-than: -1
24
+ - regular-branches: true
25
+ - change-request:
26
+ ignore-target-only-changes: false
27
+ clean:
28
+ after: true
29
+ before: true
30
+ prune: true
31
+ shallow-clone: true
32
+ depth: 3
33
+ do-not-fetch-tags: true
34
+ submodule:
35
+ disable: false
36
+ recursive: true
37
+ parent-credentials: true
38
+ timeout: 100
39
+ timeout: '15'
40
+ use-author: true
41
+ wipe-workspace: 'True'
@@ -0,0 +1,4 @@
1
+ ---
2
+ - job:
3
+ name: apm-agent-ruby
4
+ project-type: folder
@@ -0,0 +1,24 @@
1
+ ---
2
+
3
+ ##### GLOBAL METADATA
4
+
5
+ - meta:
6
+ cluster: apm-ci
7
+
8
+ ##### JOB DEFAULTS
9
+
10
+ - job:
11
+ view: APM-CI
12
+ project-type: multibranch
13
+ logrotate:
14
+ daysToKeep: 30
15
+ numToKeep: 300
16
+ number-to-keep: '100'
17
+ days-to-keep: '30'
18
+ concurrent: true
19
+ node: linux
20
+ periodic-folder-trigger: 1d
21
+ prune-dead-branches: true
22
+ publishers:
23
+ - email:
24
+ recipients: infra-root+build@elastic.co
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env groovy
2
+ @Library('apm@current') _
3
+
4
+ pipeline {
5
+ agent { label 'docker && linux && immutable' }
6
+ options {
7
+ buildDiscarder(logRotator(numToKeepStr: '20', artifactNumToKeepStr: '20', daysToKeepStr: '30'))
8
+ timestamps()
9
+ ansiColor('xterm')
10
+ disableResume()
11
+ durabilityHint('PERFORMANCE_OPTIMIZED')
12
+ rateLimitBuilds(throttle: [count: 60, durationName: 'hour', userBoost: true])
13
+ quietPeriod(10)
14
+ }
15
+ triggers {
16
+ issueCommentTrigger('(?i).*(?:jenkins\\W+)?run\\W+(?:the\\W+)?linters(?:\\W+please)?.*')
17
+ }
18
+ stages {
19
+ stage('Sanity checks') {
20
+ environment {
21
+ HOME = "${env.WORKSPACE}"
22
+ PATH = "${env.WORKSPACE}/bin:${env.PATH}"
23
+ }
24
+ steps {
25
+ script {
26
+ def sha = getGitCommitSha()
27
+ preCommit(commit: "${sha}", junit: true)
28
+ }
29
+ }
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env bash
2
+ set -exo pipefail
3
+
4
+ # Enable git+ssh. Env variables are created on the fly with the gitCheckout
5
+ git config remote.origin.url "git@github.com:${ORG_NAME}/${REPO_NAME}.git"
6
+
7
+ # Enable to fetch branches when cloning with a detached and shallow clone
8
+ git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
9
+
10
+ # Force the git user details when pushing using the last commit details
11
+ USER_MAIL=$(git log -1 --pretty=format:'%ae')
12
+ USER_NAME=$(git log -1 --pretty=format:'%an')
13
+ git config --global user.email "${USER_MAIL}"
14
+ git config --global user.name "${USER_NAME}"
15
+
16
+ # Checkout the branch as it's detached based by default.
17
+ # See https://issues.jenkins-ci.org/browse/JENKINS-33171
18
+ git fetch --all
19
+ git checkout "${BRANCH_NAME}"
20
+
21
+ # Ensure the master branch points to the original commit to avoid commit injection
22
+ # when running the release pipeline.
23
+ git reset --hard "${GIT_COMMIT}"
@@ -0,0 +1,22 @@
1
+ repos:
2
+ - repo: git://github.com/pre-commit/pre-commit-hooks
3
+ rev: v2.2.3
4
+ hooks:
5
+ - id: check-case-conflict
6
+ - id: check-executables-have-shebangs
7
+ - id: check-json
8
+ - id: check-merge-conflict
9
+ - id: check-yaml
10
+ - id: check-xml
11
+ - id: end-of-file-fixer
12
+
13
+ - repo: git@github.com:elastic/apm-pipeline-library
14
+ rev: current
15
+ hooks:
16
+ - id: check-bash-syntax
17
+ - id: check-abstract-classes-and-trait
18
+ - id: check-jsonslurper-class
19
+ - id: check-jenkins-pipelines
20
+ - id: check-unicode-non-breaking-spaces
21
+ - id: remove-unicode-non-breaking-spaces
22
+ - id: check-jjbb
data/.rspec CHANGED
@@ -1,3 +1,2 @@
1
1
  --color
2
2
  --require spec_helper
3
- --format documentation
@@ -66,9 +66,6 @@ Style/DoubleNegation:
66
66
  Style/EmptyMethod:
67
67
  Enabled: false
68
68
 
69
- Rails/Delegate:
70
- Enabled: false
71
-
72
69
  Style/NumericPredicate:
73
70
  Enabled: false
74
71
 
@@ -83,3 +80,6 @@ Naming/MemoizedInstanceVariableName:
83
80
 
84
81
  Style/SpecialGlobalVars:
85
82
  Enabled: false
83
+
84
+ Style/MissingRespondToMissing:
85
+ Enabled: false
@@ -4,6 +4,63 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## 2.11.0 (2019-09-23)
8
+
9
+ ### Added
10
+
11
+ - Add `Rails` module with `#start` method to run Rails setup explicitly ([#522](https://github.com/elastic/apm-agent-ruby/pull/522))
12
+ - Support for log/trace correlation ([#527](https://github.com/elastic/apm-agent-ruby/pull/527))
13
+
14
+ ### Changed
15
+
16
+ - Split dot-separated `span.type` into `.type`, `.subtype` and `.action` (auto-upgrades dot style) ([#531](https://github.com/elastic/apm-agent-ruby/pull/531))
17
+
18
+ ## 2.10.1
19
+
20
+ ### Fixed
21
+
22
+ - Fixed loading options from a config file specified by `ELASTIC_APM_CONFIG_FILE` ([#518](https://github.com/elastic/apm-agent-ruby/pull/518))
23
+ - Fixed an issue with CentralConfig polling not starting ([#525](https://github.com/elastic/apm-agent-ruby/pull/525))
24
+
25
+ ### Added
26
+
27
+ - Support for chained exceptions ([#488](https://github.com/elastic/apm-agent-ruby/pull/488))
28
+
29
+ ## 2.10.0
30
+
31
+ ### Added
32
+
33
+ - Add Ruby specific metrics ([#437](https://github.com/elastic/apm-agent-ruby/pull/437))
34
+ - Support for APM Agent Configuration via Kibana ([#464](https://github.com/elastic/apm-agent-ruby/pull/464))
35
+ - Change span name format and add command to context's db.statement for `MongoSpy` ([#488](https://github.com/elastic/apm-agent-ruby/pull/490))
36
+
37
+ ### Changed
38
+
39
+ - `ElasticAPM.report` and `ElasticAPM.report_message` return the string ID of the generated `Error` objects ([#507](https://github.com/elastic/apm-agent-ruby/pull/507))
40
+
41
+ ## 2.9.1 (2019-06-28)
42
+
43
+ ### Fixed
44
+
45
+ - Use system CA certificate if none is specified ([#460](https://github.com/elastic/apm-agent-ruby/pull/460))
46
+
47
+ ## 2.9.0 (2019-06-25)
48
+
49
+ ### Security
50
+
51
+ - **NB:** If you are using a custom CA cert via `server_ca_cert`, versions of the agent prior to 2.9.0 may not have validated the certificate of APM Server correctly.
52
+
53
+ ### Added
54
+
55
+ - Add `transaction.type` to errors ([#434](https://github.com/elastic/apm-agent-ruby/pull/434))
56
+ - Add cookies to `request.cookies` ([#448](https://github.com/elastic/apm-agent-ruby/pull/448))
57
+
58
+ ### Fixed
59
+
60
+ - Fix support for older versions of Http.rb ([#438](https://github.com/elastic/apm-agent-ruby/pull/434))
61
+ - Strip `Cookie` and `Set-Cookie` from headers ([#448](https://github.com/elastic/apm-agent-ruby/pull/448))
62
+ - Fix disabling SSL verification ([#449](https://github.com/elastic/apm-agent-ruby/pull/449))
63
+
7
64
  ## 2.8.1 (2019-05-29)
8
65
 
9
66
  ### Fixed
@@ -59,7 +116,7 @@ This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html
59
116
 
60
117
  Both APIs are backwards compatible with fallbacks and deprecation warnings, scheduled for removal in next major release.
61
118
 
62
- ### Added
119
+ ### Added
63
120
 
64
121
  - Configuration options to use an HTTP proxy ([#352](https://github.com/elastic/apm-agent-ruby/pull/352))
65
122
 
@@ -120,7 +177,7 @@ Both APIs are backwards compatible with fallbacks and deprecation warnings, sche
120
177
  ### Added
121
178
 
122
179
  - Support for [OpenTracing](https://opentracing.io) ([#273](https://github.com/elastic/apm-agent-ruby/pull/273))
123
- - Add capture_* options ([#279](https://github.com/elastic/apm-agent-ruby/pull/279))
180
+ - Add capture\_\* options ([#279](https://github.com/elastic/apm-agent-ruby/pull/279))
124
181
  - Evaluate the config file as ERB ([#288](https://github.com/elastic/apm-agent-ruby/pull/288))
125
182
 
126
183
  ### Changed