From d2972209386f3609c3da16a2a2120aa19af03b97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20=C3=81lvarez?= Date: Fri, 10 May 2019 15:08:04 +0200 Subject: [PATCH 1/2] add ephemeral_id attribute to agent --- _meta/fields.common.yml | 10 ++++++++-- .../TestPublishIntegrationErrors.approved.json | 4 ++++ .../TestPublishIntegrationSpans.approved.json | 1 + ...estPublishIntegrationTransactions.approved.json | 1 + docs/data/elasticsearch/generated/errors.json | 4 ++++ docs/data/elasticsearch/generated/spans.json | 1 + .../data/elasticsearch/generated/transactions.json | 1 + docs/fields.asciidoc | 14 ++++++++++++-- docs/spec/service.json | 5 +++++ docs/spec/spans/span.json | 5 +++++ include/fields.go | 2 +- model/context_test.go | 5 +++-- model/error/generated/schema/error.go | 5 +++++ model/metadata/generated/schema/metadata.go | 5 +++++ model/metadata/service.go | 11 +++++++---- model/span/generated/schema/span.go | 5 +++++ ...full_event with experimental=true.approved.json | 1 + model/transaction/generated/schema/transaction.go | 5 +++++ .../testIntakeIntegrationErrors.approved.json | 4 ++++ .../testIntakeIntegrationSpans.approved.json | 1 + ...testIntakeIntegrationTransactions.approved.json | 1 + testdata/intake-v2/errors.ndjson | 4 ++-- testdata/intake-v2/only-metadata.ndjson | 2 +- testdata/intake-v2/spans.ndjson | 2 +- testdata/intake-v2/transactions.ndjson | 2 +- 25 files changed, 85 insertions(+), 16 deletions(-) diff --git a/_meta/fields.common.yml b/_meta/fields.common.yml index 040440f78c8..c4a719d85b7 100644 --- a/_meta/fields.common.yml +++ b/_meta/fields.common.yml @@ -94,7 +94,7 @@ type: object enabled: false description: > - The canonicalized headers of the monitored HTTP request. + The canonical headers of the monitored HTTP request. - name: response type: group @@ -116,7 +116,7 @@ type: object enabled: false description: > - The canonicalized headers of the monitored HTTP response. + The canonical headers of the monitored HTTP response. - name: labels type: object @@ -248,6 +248,12 @@ Version of the agent used. overwrite: true + - name: ephemeral_id + type: keyword + description: > + The Ephemeral ID identifies a running process. + overwrite: true + - name: container type: group dynamic: false diff --git a/beater/test_approved_es_documents/TestPublishIntegrationErrors.approved.json b/beater/test_approved_es_documents/TestPublishIntegrationErrors.approved.json index b3d7b6680dc..e4a27240649 100644 --- a/beater/test_approved_es_documents/TestPublishIntegrationErrors.approved.json +++ b/beater/test_approved_es_documents/TestPublishIntegrationErrors.approved.json @@ -8,6 +8,7 @@ }, "@timestamp": "2017-05-09T15:04:05.999Z", "agent": { + "ephemeral_id": "abcdef123", "name": "elastic-node", "version": "3.14.0" }, @@ -314,6 +315,7 @@ }, "@timestamp": "2018-08-09T14:59:05.999Z", "agent": { + "ephemeral_id": "abcdef123", "name": "elastic-node", "version": "3.14.0" }, @@ -405,6 +407,7 @@ }, "@timestamp": "2019-01-09T21:40:53.000Z", "agent": { + "ephemeral_id": "justanid", "name": "elastic-ruby", "version": "2.1.3" }, @@ -502,6 +505,7 @@ }, "@timestamp": "2018-08-09T15:04:05.999Z", "agent": { + "ephemeral_id": "abcdef123", "name": "elastic-node", "version": "3.14.0" }, diff --git a/beater/test_approved_es_documents/TestPublishIntegrationSpans.approved.json b/beater/test_approved_es_documents/TestPublishIntegrationSpans.approved.json index 282a2eed7fd..a8da6c59f87 100644 --- a/beater/test_approved_es_documents/TestPublishIntegrationSpans.approved.json +++ b/beater/test_approved_es_documents/TestPublishIntegrationSpans.approved.json @@ -226,6 +226,7 @@ }, "@timestamp": "2019-01-09T21:40:53.000Z", "agent": { + "ephemeral_id": "justanid", "name": "elastic-ruby", "version": "2.2" }, diff --git a/beater/test_approved_es_documents/TestPublishIntegrationTransactions.approved.json b/beater/test_approved_es_documents/TestPublishIntegrationTransactions.approved.json index d033e8ecdaa..e39690e3c31 100644 --- a/beater/test_approved_es_documents/TestPublishIntegrationTransactions.approved.json +++ b/beater/test_approved_es_documents/TestPublishIntegrationTransactions.approved.json @@ -299,6 +299,7 @@ }, "@timestamp": "2018-07-30T18:53:42.281Z", "agent": { + "ephemeral_id": "justanid", "name": "elastic-ruby", "version": "2.2" }, diff --git a/docs/data/elasticsearch/generated/errors.json b/docs/data/elasticsearch/generated/errors.json index 2f73f764c35..1007f631e50 100644 --- a/docs/data/elasticsearch/generated/errors.json +++ b/docs/data/elasticsearch/generated/errors.json @@ -3,6 +3,7 @@ { "@timestamp": "2017-05-09T15:04:05.999999Z", "agent": { + "ephemeral_id": "abcdef123", "name": "elastic-node", "version": "3.14.0" }, @@ -293,6 +294,7 @@ { "@timestamp": "2018-08-09T14:59:05.999Z", "agent": { + "ephemeral_id": "abcdef123", "name": "elastic-node", "version": "3.14.0" }, @@ -368,6 +370,7 @@ { "@timestamp": "2018-08-01T10:00:00Z", "agent": { + "ephemeral_id": "justanid", "name": "elastic-ruby", "version": "2.1.3" }, @@ -449,6 +452,7 @@ { "@timestamp": "2018-08-09T15:04:05.999Z", "agent": { + "ephemeral_id": "abcdef123", "name": "elastic-node", "version": "3.14.0" }, diff --git a/docs/data/elasticsearch/generated/spans.json b/docs/data/elasticsearch/generated/spans.json index 743ca82ec94..2a943701dbf 100644 --- a/docs/data/elasticsearch/generated/spans.json +++ b/docs/data/elasticsearch/generated/spans.json @@ -157,6 +157,7 @@ { "@timestamp": "2018-08-01T10:00:00.00283092Z", "agent": { + "ephemeral_id": "justanid", "name": "elastic-ruby", "version": "2.2" }, diff --git a/docs/data/elasticsearch/generated/transactions.json b/docs/data/elasticsearch/generated/transactions.json index b9508747025..494cd86a055 100644 --- a/docs/data/elasticsearch/generated/transactions.json +++ b/docs/data/elasticsearch/generated/transactions.json @@ -262,6 +262,7 @@ { "@timestamp": "2018-07-30T18:53:42.281Z", "agent": { + "ephemeral_id": "justanid", "name": "elastic-ruby", "version": "2.2" }, diff --git a/docs/fields.asciidoc b/docs/fields.asciidoc index c2941170117..9a77e6c3add 100644 --- a/docs/fields.asciidoc +++ b/docs/fields.asciidoc @@ -167,7 +167,7 @@ The http method of the request leading to this event. -- type: object -The canonicalized headers of the monitored HTTP request. +The canonical headers of the monitored HTTP request. Object is not enabled. @@ -200,7 +200,7 @@ Used by the Node agent to indicate when in the response life cycle an error has -- type: object -The canonicalized headers of the monitored HTTP response. +The canonical headers of the monitored HTTP response. Object is not enabled. @@ -389,6 +389,16 @@ type: keyword Version of the agent used. +-- + +*`agent.ephemeral_id`*:: ++ +-- +type: keyword + +The Ephemeral ID identifies a running process. + + -- [float] diff --git a/docs/spec/service.json b/docs/spec/service.json index 6d5786f70a6..f844b1acb6a 100644 --- a/docs/spec/service.json +++ b/docs/spec/service.json @@ -16,6 +16,11 @@ "description": "Version of the Elastic APM agent, e.g.\"1.0.0\"", "type": ["string", "null"], "maxLength": 1024 + }, + "ephemeral_id": { + "description": "Free format ID used for metrics correlation by some agents", + "type": ["string", "null"], + "maxLength": 1024 } } }, diff --git a/docs/spec/spans/span.json b/docs/spec/spans/span.json index 04989c913f1..e72244dd02a 100644 --- a/docs/spec/spans/span.json +++ b/docs/spec/spans/span.json @@ -113,6 +113,11 @@ "null" ], "maxLength": 1024 + }, + "ephemeral_id": { + "description": "Free format ID used for metrics correlation by some agents", + "type": ["string", "null"], + "maxLength": 1024 } } }, diff --git a/include/fields.go b/include/fields.go index f501a743526..a65b56277f1 100644 --- a/include/fields.go +++ b/include/fields.go @@ -32,5 +32,5 @@ func init() { // AssetFieldsYml returns asset data. // This is the base64 encoded gzipped contents of fields.yml. func AssetFieldsYml() string { - return "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" + return "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" } diff --git a/model/context_test.go b/model/context_test.go index d789b186836..da5ad29529d 100644 --- a/model/context_test.go +++ b/model/context_test.go @@ -148,8 +148,9 @@ func TestDecodeContext(t *testing.T) { "version": "1.2.3", }, "agent": common.MapStr{ - "name": "elastic-node", - "version": "1.0.0", + "name": "elastic-node", + "version": "1.0.0", + "ephemeral_id": "abcdef123", }}, "page": map[string]interface{}{"url": "https://example.com", "referer": "http://refer.example.com"}, }}, diff --git a/model/error/generated/schema/error.go b/model/error/generated/schema/error.go index 3b4ad8e3978..b1073efe22b 100644 --- a/model/error/generated/schema/error.go +++ b/model/error/generated/schema/error.go @@ -282,6 +282,11 @@ const ModelSchema = `{ "description": "Version of the Elastic APM agent, e.g.\"1.0.0\"", "type": ["string", "null"], "maxLength": 1024 + }, + "ephemeral_id": { + "description": "Free format ID used for metrics correlation by some agents", + "type": ["string", "null"], + "maxLength": 1024 } } }, diff --git a/model/metadata/generated/schema/metadata.go b/model/metadata/generated/schema/metadata.go index efa97970bea..138bc0cbc3f 100644 --- a/model/metadata/generated/schema/metadata.go +++ b/model/metadata/generated/schema/metadata.go @@ -41,6 +41,11 @@ const ModelSchema = `{ "description": "Version of the Elastic APM agent, e.g.\"1.0.0\"", "type": ["string", "null"], "maxLength": 1024 + }, + "ephemeral_id": { + "description": "Free format ID used for metrics correlation by some agents", + "type": ["string", "null"], + "maxLength": 1024 } } }, diff --git a/model/metadata/service.go b/model/metadata/service.go index c7354f80be8..ebb753b0249 100644 --- a/model/metadata/service.go +++ b/model/metadata/service.go @@ -47,8 +47,9 @@ type Framework struct { Version *string } type Agent struct { - Name *string - Version *string + Name *string + Version *string + EphemeralId *string } func DecodeService(input interface{}, err error) (*Service, error) { @@ -65,8 +66,9 @@ func DecodeService(input interface{}, err error) (*Service, error) { Version: decoder.StringPtr(raw, "version"), Environment: decoder.StringPtr(raw, "environment"), Agent: Agent{ - Name: decoder.StringPtr(raw, "name", "agent"), - Version: decoder.StringPtr(raw, "version", "agent"), + Name: decoder.StringPtr(raw, "name", "agent"), + Version: decoder.StringPtr(raw, "version", "agent"), + EphemeralId: decoder.StringPtr(raw, "ephemeral_id", "agent"), }, Framework: Framework{ Name: decoder.StringPtr(raw, "name", "framework"), @@ -133,5 +135,6 @@ func (a *Agent) fields() common.MapStr { agent := common.MapStr{} utility.Set(agent, "name", a.Name) utility.Set(agent, "version", a.Version) + utility.Set(agent, "ephemeral_id", a.EphemeralId) return agent } diff --git a/model/span/generated/schema/span.go b/model/span/generated/schema/span.go index 1b141b98de5..9de40b75bfb 100644 --- a/model/span/generated/schema/span.go +++ b/model/span/generated/schema/span.go @@ -151,6 +151,11 @@ const ModelSchema = `{ "null" ], "maxLength": 1024 + }, + "ephemeral_id": { + "description": "Free format ID used for metrics correlation by some agents", + "type": ["string", "null"], + "maxLength": 1024 } } }, diff --git a/model/test_approved_model/context_full_event with experimental=true.approved.json b/model/test_approved_model/context_full_event with experimental=true.approved.json index 0637d16dcb1..19499c86de4 100644 --- a/model/test_approved_model/context_full_event with experimental=true.approved.json +++ b/model/test_approved_model/context_full_event with experimental=true.approved.json @@ -56,6 +56,7 @@ }, "Service": { "Agent": { + "EphemeralId": "abcdef123", "Name": "elastic-node", "Version": "1.0.0" }, diff --git a/model/transaction/generated/schema/transaction.go b/model/transaction/generated/schema/transaction.go index d950e52e3c7..a25dd529447 100644 --- a/model/transaction/generated/schema/transaction.go +++ b/model/transaction/generated/schema/transaction.go @@ -278,6 +278,11 @@ const ModelSchema = `{ "description": "Version of the Elastic APM agent, e.g.\"1.0.0\"", "type": ["string", "null"], "maxLength": 1024 + }, + "ephemeral_id": { + "description": "Free format ID used for metrics correlation by some agents", + "type": ["string", "null"], + "maxLength": 1024 } } }, diff --git a/processor/stream/test_approved_es_documents/testIntakeIntegrationErrors.approved.json b/processor/stream/test_approved_es_documents/testIntakeIntegrationErrors.approved.json index 2f73f764c35..1007f631e50 100644 --- a/processor/stream/test_approved_es_documents/testIntakeIntegrationErrors.approved.json +++ b/processor/stream/test_approved_es_documents/testIntakeIntegrationErrors.approved.json @@ -3,6 +3,7 @@ { "@timestamp": "2017-05-09T15:04:05.999999Z", "agent": { + "ephemeral_id": "abcdef123", "name": "elastic-node", "version": "3.14.0" }, @@ -293,6 +294,7 @@ { "@timestamp": "2018-08-09T14:59:05.999Z", "agent": { + "ephemeral_id": "abcdef123", "name": "elastic-node", "version": "3.14.0" }, @@ -368,6 +370,7 @@ { "@timestamp": "2018-08-01T10:00:00Z", "agent": { + "ephemeral_id": "justanid", "name": "elastic-ruby", "version": "2.1.3" }, @@ -449,6 +452,7 @@ { "@timestamp": "2018-08-09T15:04:05.999Z", "agent": { + "ephemeral_id": "abcdef123", "name": "elastic-node", "version": "3.14.0" }, diff --git a/processor/stream/test_approved_es_documents/testIntakeIntegrationSpans.approved.json b/processor/stream/test_approved_es_documents/testIntakeIntegrationSpans.approved.json index 743ca82ec94..2a943701dbf 100644 --- a/processor/stream/test_approved_es_documents/testIntakeIntegrationSpans.approved.json +++ b/processor/stream/test_approved_es_documents/testIntakeIntegrationSpans.approved.json @@ -157,6 +157,7 @@ { "@timestamp": "2018-08-01T10:00:00.00283092Z", "agent": { + "ephemeral_id": "justanid", "name": "elastic-ruby", "version": "2.2" }, diff --git a/processor/stream/test_approved_es_documents/testIntakeIntegrationTransactions.approved.json b/processor/stream/test_approved_es_documents/testIntakeIntegrationTransactions.approved.json index b9508747025..494cd86a055 100644 --- a/processor/stream/test_approved_es_documents/testIntakeIntegrationTransactions.approved.json +++ b/processor/stream/test_approved_es_documents/testIntakeIntegrationTransactions.approved.json @@ -262,6 +262,7 @@ { "@timestamp": "2018-07-30T18:53:42.281Z", "agent": { + "ephemeral_id": "justanid", "name": "elastic-ruby", "version": "2.2" }, diff --git a/testdata/intake-v2/errors.ndjson b/testdata/intake-v2/errors.ndjson index ee28bbb495f..9b982d0e725 100644 --- a/testdata/intake-v2/errors.ndjson +++ b/testdata/intake-v2/errors.ndjson @@ -1,5 +1,5 @@ -{"metadata": {"process": {"ppid": 6789, "pid": 1234, "argv": ["node", "server.js"], "title": "node"}, "user": { "id": 123, "username": "bar", "email": "bar@example.com"}, "system": {"platform": "darwin", "hostname": "prod1.example.com", "architecture": "x64", "container": {"id": "container-id"}, "kubernetes": {"namespace": "namespace1", "pod": {"uid": "pod-uid", "name": "pod-name"}, "node": {"name": "node-name"}}}, "service": {"name": "1234_service-12a3", "language": {"version": "8", "name": "ecmascript"}, "agent": {"version": "3.14.0", "name": "elastic-node"}, "environment": "staging", "framework": {"version": "1.2.3", "name": "Express"}, "version": "5.1.3", "runtime": {"version": "8.0.0", "name": "node"}}}} +{"metadata": {"process": {"ppid": 6789, "pid": 1234, "argv": ["node", "server.js"], "title": "node"}, "user": { "id": 123, "username": "bar", "email": "bar@example.com"}, "system": {"platform": "darwin", "hostname": "prod1.example.com", "architecture": "x64", "container": {"id": "container-id"}, "kubernetes": {"namespace": "namespace1", "pod": {"uid": "pod-uid", "name": "pod-name"}, "node": {"name": "node-name"}}}, "service": {"name": "1234_service-12a3", "language": {"version": "8", "name": "ecmascript"}, "agent": {"version": "3.14.0", "name": "elastic-node", "ephemeral_id":"abcdef123"}, "environment": "staging", "framework": {"version": "1.2.3", "name": "Express"}, "version": "5.1.3", "runtime": {"version": "8.0.0", "name": "node"}}}} {"error": {"id": "0123456789012345", "timestamp": 1494342245999999, "culprit": "my.module.function_name","log": { "message": "My service could not talk to the database named foobar", "param_message": "My service could not talk to the database named %s", "logger_name": "my.logger.name", "level": "warning", "stacktrace": [ { "abs_path": "/real/file/name.py", "filename": "/webpack/file/name.py", "function": "foo", "vars": { "key": "value" }, "pre_context": ["line1", "line2"], "context_line": "line3","library_frame": false,"lineno": 3,"module": "App::MyModule","colno": 4,"post_context": ["line4","line5" ]},{"filename": "lib/instrumentation/index.js","lineno": 102,"function": "instrumented","abs_path": "/Users/watson/code/node_modules/elastic/lib/instrumentation/index.js","vars": {"key": "value"},"pre_context": [" var trans = this.currentTransaction",""," return instrumented",""," function instrumented () {"," var prev = ins.currentTransaction", " ins.currentTransaction = trans"],"context_line": " var result = original.apply(this, arguments)","post_context": [" ins.currentTransaction = prev"," return result","}","}","","Instrumentation.prototype._recoverTransaction = function (trans) {"," if (this.currentTransaction === trans) return"]}]},"exception": {"message": "The username root is unknown","type": "DbError","module": "__builtins__","code": 42,"handled": false,"attributes": {"foo": "bar" },"stacktrace": [{ "abs_path": "/real/file/name.py","filename": "file/name.py","function": "foo","vars": {"key": "value"},"pre_context": ["line1","line2"],"context_line": "line3", "library_frame": true,"lineno": 3,"module": "App::MyModule","colno": 4,"post_context": ["line4","line5"]},{"filename": "lib/instrumentation/index.js","lineno": 102,"function": "instrumented","abs_path": "/Users/watson/code/node_modules/elastic/lib/instrumentation/index.js","vars": {"key": "value"},"pre_context": [" var trans = this.currentTransaction",""," return instrumented",""," function instrumented () {", " var prev = ins.currentTransaction"," ins.currentTransaction = trans"],"context_line": " var result = original.apply(this, arguments)","post_context": [" ins.currentTransaction = prev"," return result","}","}","","Instrumentation.prototype._recoverTransaction = function (trans) {"," if (this.currentTransaction === trans) return"]}]},"context": {"page":{"referer":"http://localhost:8000/test/e2e/","url":"http://localhost:8000/test/e2e/general-usecase/"}, "request": {"socket": {"remote_address": "12.53.12.1","encrypted": true},"http_version": "1.1","method": "POST","url": {"protocol": "https:","full": "https://www.example.com/p/a/t/h?query=string#hash","hostname": "www.example.com","port": 8080,"pathname": "/p/a/t/h","search": "?query=string", "hash": "#hash","raw": "/p/a/t/h?query=string#hash"},"headers": {"user-agent": "Mozilla Chrome Edge","content-type": "text/html","cookie": "c1=v1,c2=v2","some-other-header": "foo","array": ["foo","bar","baz"]}, "cookies": {"c1": "v1", "c2": "v2" },"env": {"SERVER_SOFTWARE": "nginx", "GATEWAY_INTERFACE": "CGI/1.1"},"body": "Hello World"},"response": { "status_code": 200, "headers": { "content-type": "application/json" },"headers_sent": true, "finished": true }, "user": { "id": 99, "username": "foo"},"tags": {"organization_uuid": "9f0e9d64-c185-4d21-a6f4-4673ed561ec8"}, "custom": {"my_key": 1,"some_other_value": "foo bar","and_objects": {"foo": ["bar","baz" ] }},"service": {"name": "service1", "language": {"version": "1.2"}, "framework": {"version": "1", "name": "Node"}}}}} { "error": {"id": "cdefab0123456789", "trace_id": null, "timestamp": 1533826745999000,"exception": {"message": "Cannot read property 'baz' no defined"}}} -{ "error": {"id": "cdefab0123456780", "trace_id": "0123456789abcdeffedcba0123456789", "parent_id": "9632587410abcdef", "exception": {"type": "DbError"}, "context":{"service": {"name": "service1", "environment":"testing","language": {"version": "2.5", "name": "ruby"}, "agent": {"version": "2.1.3", "name": "elastic-ruby"}, "framework": {"version": "5.0", "name": "Rails"}, "version": "2", "runtime": {"version": "2.5", "name": "cruby"}}}}} +{ "error": {"id": "cdefab0123456780", "trace_id": "0123456789abcdeffedcba0123456789", "parent_id": "9632587410abcdef", "exception": {"type": "DbError"}, "context":{"service": {"name": "service1", "environment":"testing","language": {"version": "2.5", "name": "ruby"}, "agent": {"version": "2.1.3", "name": "elastic-ruby", "ephemeral_id":"justanid"}, "framework": {"version": "5.0", "name": "Rails"}, "version": "2", "runtime": {"version": "2.5", "name": "cruby"}}}}} { "error": {"id": "abcdef0123456789", "trace_id": "0123456789abcdeffedcba0123456789", "parent_id": "9632587410abcdef", "transaction_id": "1234567890987654", "transaction": { "sampled": true, "type": "request"}, "timestamp": 1533827045999000,"log": {"level": "custom log level","message": "Cannot read property 'baz' of undefined"}}} diff --git a/testdata/intake-v2/only-metadata.ndjson b/testdata/intake-v2/only-metadata.ndjson index dea9b12bb9b..9906faa1fab 100644 --- a/testdata/intake-v2/only-metadata.ndjson +++ b/testdata/intake-v2/only-metadata.ndjson @@ -1 +1 @@ -{"metadata": {"process": {"ppid": 6789, "pid": 1234, "argv": ["node", "server.js"], "title": "node"}, "system": {"platform": "darwin", "hostname": "prod1.example.com", "architecture": "x64", "container": {"id": "container-id"}, "kubernetes": {"namespace": "namespace1", "pod": {"uid": "pod-uid", "name": "pod-name"}, "node": {"name": "node-name"}}}, "service": {"name": "1234_service-12a3", "language": {"version": "8", "name": "ecmascript"}, "agent": {"version": "3.14.0", "name": "elastic-node"}, "environment": "staging", "framework": {"version": "1.2.3", "name": "Express"}, "version": "5.1.3", "runtime": {"version": "8.0.0", "name": "node"}}, "labels": {"tag0": null, "tag1": "one", "tag2": 2}, "user": {"id": "99","username": "foo","email": "foo@example.com"}}} +{"metadata": {"process": {"ppid": 6789, "pid": 1234, "argv": ["node", "server.js"], "title": "node"}, "system": {"platform": "darwin", "hostname": "prod1.example.com", "architecture": "x64", "container": {"id": "container-id"}, "kubernetes": {"namespace": "namespace1", "pod": {"uid": "pod-uid", "name": "pod-name"}, "node": {"name": "node-name"}}}, "service": {"name": "1234_service-12a3", "language": {"version": "8", "name": "ecmascript"}, "agent": {"version": "3.14.0", "name": "elastic-node", "ephemeral_id": "123abcdef"}, "environment": "staging", "framework": {"version": "1.2.3", "name": "Express"}, "version": "5.1.3", "runtime": {"version": "8.0.0", "name": "node"}}, "labels": {"tag0": null, "tag1": "one", "tag2": 2}, "user": {"id": "99","username": "foo","email": "foo@example.com"}}} diff --git a/testdata/intake-v2/spans.ndjson b/testdata/intake-v2/spans.ndjson index 52a792e1843..e4758c8f5e3 100644 --- a/testdata/intake-v2/spans.ndjson +++ b/testdata/intake-v2/spans.ndjson @@ -3,4 +3,4 @@ {"span": {"trace_id": "abcdef0123456789abcdef9876543210", "parent_id": "0000000011111111", "id": "1234abcdef567895", "transaction_id": "ab45781d265894fe", "name": "GET /api/types", "type": "request", "start": 22, "duration": 32.592981, "timestamp": 1532976822281000,"context":{"service":{"environment":"prod","agent":{}}}}} {"span": {"trace_id": "abcdef0123456789abcdef9876543210", "parent_id": "abcdefabcdef7890", "id": "0123456a89012345", "transaction_id": "ab23456a89012345", "name": "GET /api/types", "type": "request.http", "start": 1.845, "duration": 3.5642981, "stacktrace": [], "context":{"tags": {"tag1": "value1", "tag2": 123, "tag3": 12.34, "tag4": true, "tag5": null},"service":{}}}}} {"span": {"trace_id": "abcdef0123456789abcdef9876543210", "parent_id": "ababcdcdefefabde", "id": "abcde56a89012345", "transaction_id": null, "name": "get /api/types", "sync": false, "type": "request", "subtype": "http", "action": "call", "start": 0, "duration": 13.9802981, "stacktrace": null, "context": null }} -{"span": {"trace_id": "abcdef0123456789abcdef9876543210", "parent_id": "abcdef0123456789", "id": "1234567890aaaade", "sync": true, "name": "SELECT FROM product_types", "type": "db.postgresql.query", "start": 2.83092, "duration": 3.781912, "stacktrace": [{ "filename": "net.js", "lineno": 547},{"filename": "file2.js", "lineno": 12, "post_context": [ " ins.currentTransaction = prev", "}"]}, { "function": "onread", "abs_path": "net.js", "filename": "net.js", "lineno": 547, "library_frame": true, "vars": { "key": "value" }, "module": "some module", "colno": 4, "context_line": "line3", "pre_context": [ " var trans = this.currentTransaction", "" ], "post_context": [ " ins.currentTransaction = prev", " return result"] }], "context": { "db": { "instance": "customers", "statement": "SELECT * FROM product_types WHERE user_id=?", "type": "sql", "user": "readonly_user" }, "http": { "url": "http://localhost:8000", "status_code": 200, "method": "GET" },"service":{"name":"service1","agent":{"version":"2.2","name":"elastic-ruby"}}}}} +{"span": {"trace_id": "abcdef0123456789abcdef9876543210", "parent_id": "abcdef0123456789", "id": "1234567890aaaade", "sync": true, "name": "SELECT FROM product_types", "type": "db.postgresql.query", "start": 2.83092, "duration": 3.781912, "stacktrace": [{ "filename": "net.js", "lineno": 547},{"filename": "file2.js", "lineno": 12, "post_context": [ " ins.currentTransaction = prev", "}"]}, { "function": "onread", "abs_path": "net.js", "filename": "net.js", "lineno": 547, "library_frame": true, "vars": { "key": "value" }, "module": "some module", "colno": 4, "context_line": "line3", "pre_context": [ " var trans = this.currentTransaction", "" ], "post_context": [ " ins.currentTransaction = prev", " return result"] }], "context": { "db": { "instance": "customers", "statement": "SELECT * FROM product_types WHERE user_id=?", "type": "sql", "user": "readonly_user" }, "http": { "url": "http://localhost:8000", "status_code": 200, "method": "GET" },"service":{"name":"service1","agent":{"version":"2.2","name":"elastic-ruby", "ephemeral_id": "justanid"}}}}} diff --git a/testdata/intake-v2/transactions.ndjson b/testdata/intake-v2/transactions.ndjson index ab8a09cf42b..264aa818cb7 100644 --- a/testdata/intake-v2/transactions.ndjson +++ b/testdata/intake-v2/transactions.ndjson @@ -1,4 +1,4 @@ {"metadata": {"service": {"name": "1234_service-12a3","version": "5.1.3","environment": "staging","language": {"name": "ecmascript","version": "8"},"runtime": {"name": "node","version": "8.0.0"},"framework": {"name": "Express","version": "1.2.3"},"agent": {"name": "elastic-node","version": "3.14.0"}},"user": {"id": "123user", "username": "bar", "email": "bar@user.com"}, "labels": {"tag0": null, "tag1": "one", "tag2": 2}, "process": {"pid": 1234,"ppid": 6789,"title": "node","argv": ["node","server.js"]},"system": {"hostname": "prod1.example.com","architecture": "x64","platform": "darwin", "container": {"id": "container-id"}, "kubernetes": {"namespace": "namespace1", "pod": {"uid": "pod-uid", "name": "pod-name"}, "node": {"name": "node-name"}}}}} {"transaction": { "id": "945254c567a5417e", "trace_id": "0123456789abcdef0123456789abcdef", "parent_id": "abcdefabcdef01234567", "type": "request", "duration": 32.592981, "span_count": { "started": 43 }}} {"transaction": {"id": "4340a8e0df1906ecbfa9", "trace_id": "0acd456789abcdef0123456789abcdef", "name": "GET /api/types","type": "request","duration": 32.592981,"result": "success", "timestamp": 1496170407154000, "sampled": true, "span_count": {"started": 17},"context": {"service": {"runtime": {"version": "7.0"}},"page":{"referer":"http://localhost:8000/test/e2e/","url":"http://localhost:8000/test/e2e/general-usecase/"}, "request": {"socket": {"remote_address": "12.53.12.1","encrypted": true},"http_version": "1.1","method": "POST","url": {"protocol": "https:","full": "https://www.example.com/p/a/t/h?query=string#hash","hostname": "www.example.com","port": "8080","pathname": "/p/a/t/h","search": "?query=string","hash": "#hash","raw": "/p/a/t/h?query=string#hash"},"headers": {"user-agent": "Mozilla Chrome Edge","content-type": "text/html","cookie": "c1=v1, c2=v2","some-other-header": "foo","array": ["foo","bar","baz"]},"cookies": {"c1": "v1","c2": "v2"},"env": {"SERVER_SOFTWARE": "nginx","GATEWAY_INTERFACE": "CGI/1.1"},"body": {"str": "hello world","additional": { "foo": {},"bar": 123,"req": "additional information"}}},"response": {"status_code": 200,"headers": {"content-type": "application/json"},"headers_sent": true,"finished": true}, "user": {"id": "99","username": "foo"},"tags": {"organization_uuid": "9f0e9d64-c185-4d21-a6f4-4673ed561ec8", "tag2": 12, "tag3": 12.45, "tag4": false, "tag5": null },"custom": {"my_key": 1,"some_other_value": "foo bar","and_objects": {"foo": ["bar","baz"]},"(": "not a valid regex and that is fine"}}}} -{"transaction": { "id": "cdef4340a8e0df19", "trace_id": "0acd456789abcdef0123456789abcdef", "type": "request", "duration": 13.980558, "timestamp": 1532976822281000, "sampled": null, "span_count": { "dropped": 55, "started": 436 }, "marks": {"navigationTiming": {"appBeforeBootstrap": 608.9300000000001,"navigationStart": -21},"another_mark": {"some_long": 10,"some_float": 10.0}, "performance": {}}, "context": { "request": { "socket": { "remote_address": null, "encrypted": null }, "method": "POST", "headers": { "user-agent": null, "content-type": null, "cookie": null }, "url": { "protocol": null, "full": null, "hostname": null, "port": null, "pathname": null, "search": null, "hash": null, "raw": null } }, "response": { "headers": { "content-type": null } }, "service": {"environment":"testing","name": "service1", "language": {"version": "2.5", "name": "ruby"}, "agent": {"version": "2.2", "name": "elastic-ruby"}, "framework": {"version": "5.0", "name": "Rails"}, "version": "2", "runtime": {"version": "2.5", "name": "cruby"}}}}} +{"transaction": { "id": "cdef4340a8e0df19", "trace_id": "0acd456789abcdef0123456789abcdef", "type": "request", "duration": 13.980558, "timestamp": 1532976822281000, "sampled": null, "span_count": { "dropped": 55, "started": 436 }, "marks": {"navigationTiming": {"appBeforeBootstrap": 608.9300000000001,"navigationStart": -21},"another_mark": {"some_long": 10,"some_float": 10.0}, "performance": {}}, "context": { "request": { "socket": { "remote_address": null, "encrypted": null }, "method": "POST", "headers": { "user-agent": null, "content-type": null, "cookie": null }, "url": { "protocol": null, "full": null, "hostname": null, "port": null, "pathname": null, "search": null, "hash": null, "raw": null } }, "response": { "headers": { "content-type": null } }, "service": {"environment":"testing","name": "service1", "language": {"version": "2.5", "name": "ruby"}, "agent": {"version": "2.2", "name": "elastic-ruby", "ephemeral_id": "justanid"}, "framework": {"version": "5.0", "name": "Rails"}, "version": "2", "runtime": {"version": "2.5", "name": "cruby"}}}}} From beca9e6117235c0de61a9e0046ee2c8ef9771613 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20=C3=81lvarez?= Date: Mon, 20 May 2019 15:59:33 +0200 Subject: [PATCH 2/2] add changelog --- changelogs/head.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/changelogs/head.asciidoc b/changelogs/head.asciidoc index cb888444294..3ab7dff669d 100644 --- a/changelogs/head.asciidoc +++ b/changelogs/head.asciidoc @@ -12,6 +12,7 @@ - Add Idle timeout to server config {pull}2122[2122]. - Upgrade Go to 1.12.4 {pull}2132[2132]. - Add geoip processing to the default ingest pipeline {pull}2177[2177]. +- Add ephemeral_id attribute in the metadata {pull}2179[2179]. [float] ==== Removed