opentelemetry-sdk 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.yardopts +9 -0
- data/CHANGELOG.md +1 -0
- data/LICENSE +201 -0
- data/README.md +73 -0
- data/lib/opentelemetry-sdk.rb +7 -0
- data/lib/opentelemetry/sdk.rb +69 -0
- data/lib/opentelemetry/sdk/configurator.rb +171 -0
- data/lib/opentelemetry/sdk/correlation_context.rb +16 -0
- data/lib/opentelemetry/sdk/correlation_context/builder.rb +40 -0
- data/lib/opentelemetry/sdk/correlation_context/manager.rb +87 -0
- data/lib/opentelemetry/sdk/instrumentation_library.rb +13 -0
- data/lib/opentelemetry/sdk/internal.rb +52 -0
- data/lib/opentelemetry/sdk/resources.rb +16 -0
- data/lib/opentelemetry/sdk/resources/constants.rb +124 -0
- data/lib/opentelemetry/sdk/resources/resource.rb +84 -0
- data/lib/opentelemetry/sdk/trace.rb +24 -0
- data/lib/opentelemetry/sdk/trace/config.rb +18 -0
- data/lib/opentelemetry/sdk/trace/config/trace_config.rb +77 -0
- data/lib/opentelemetry/sdk/trace/export.rb +30 -0
- data/lib/opentelemetry/sdk/trace/export/batch_span_processor.rb +144 -0
- data/lib/opentelemetry/sdk/trace/export/console_span_exporter.rb +40 -0
- data/lib/opentelemetry/sdk/trace/export/in_memory_span_exporter.rb +86 -0
- data/lib/opentelemetry/sdk/trace/export/multi_span_exporter.rb +58 -0
- data/lib/opentelemetry/sdk/trace/export/noop_span_exporter.rb +42 -0
- data/lib/opentelemetry/sdk/trace/export/simple_span_processor.rb +72 -0
- data/lib/opentelemetry/sdk/trace/multi_span_processor.rb +62 -0
- data/lib/opentelemetry/sdk/trace/noop_span_processor.rb +50 -0
- data/lib/opentelemetry/sdk/trace/samplers.rb +90 -0
- data/lib/opentelemetry/sdk/trace/samplers/constant_sampler.rb +33 -0
- data/lib/opentelemetry/sdk/trace/samplers/decision.rb +26 -0
- data/lib/opentelemetry/sdk/trace/samplers/parent_or_else.rb +43 -0
- data/lib/opentelemetry/sdk/trace/samplers/probability_sampler.rb +64 -0
- data/lib/opentelemetry/sdk/trace/samplers/result.rb +55 -0
- data/lib/opentelemetry/sdk/trace/span.rb +336 -0
- data/lib/opentelemetry/sdk/trace/span_data.rb +34 -0
- data/lib/opentelemetry/sdk/trace/tracer.rb +78 -0
- data/lib/opentelemetry/sdk/trace/tracer_provider.rb +84 -0
- data/lib/opentelemetry/sdk/version.rb +12 -0
- metadata +207 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2019 OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
require 'opentelemetry/sdk/correlation_context/builder'
|
8
|
+
require 'opentelemetry/sdk/correlation_context/manager'
|
9
|
+
|
10
|
+
module OpenTelemetry
|
11
|
+
module SDK
|
12
|
+
# Contains operational implementations of the CorrelationContext::Manager
|
13
|
+
module CorrelationContext
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2019 OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
module CorrelationContext
|
10
|
+
# SDK implementation of CorrelationContext::Builder
|
11
|
+
class Builder
|
12
|
+
attr_reader :entries
|
13
|
+
|
14
|
+
def initialize(entries)
|
15
|
+
@entries = entries
|
16
|
+
end
|
17
|
+
|
18
|
+
# Set key-value in the to-be-created correlation context
|
19
|
+
#
|
20
|
+
# @param [String] key The key to store this value under
|
21
|
+
# @param [String] value String value to be stored under key
|
22
|
+
def set_value(key, value)
|
23
|
+
@entries[key] = value.to_s
|
24
|
+
end
|
25
|
+
|
26
|
+
# Removes key from the to-be-created correlation context
|
27
|
+
#
|
28
|
+
# @param [String] key The key to remove
|
29
|
+
def remove_value(key)
|
30
|
+
@entries.delete(key)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Clears all correlations from the to-be-created correlation context
|
34
|
+
def clear
|
35
|
+
@entries.clear
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2019 OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
module CorrelationContext
|
10
|
+
# Manages correlation context
|
11
|
+
class Manager
|
12
|
+
CORRELATION_CONTEXT_KEY = OpenTelemetry::CorrelationContext::Propagation::ContextKeys.correlation_context_key
|
13
|
+
EMPTY_CORRELATION_CONTEXT = {}.freeze
|
14
|
+
private_constant(:CORRELATION_CONTEXT_KEY, :EMPTY_CORRELATION_CONTEXT)
|
15
|
+
|
16
|
+
# Used to chain modifications to correlation context. The result is a
|
17
|
+
# context with an updated correlation context. If only a single
|
18
|
+
# modification is being made to correlation context, use the other
|
19
|
+
# methods on +Manager+, if multiple modifications are being made, use
|
20
|
+
# this one.
|
21
|
+
#
|
22
|
+
# @param [optional Context] context The context to update with with new
|
23
|
+
# modified correlation context. Defaults to +Context.current+
|
24
|
+
# @return [Context]
|
25
|
+
def build_context(context: Context.current)
|
26
|
+
builder = Builder.new(correlations_for(context).dup)
|
27
|
+
yield builder
|
28
|
+
context.set_value(CORRELATION_CONTEXT_KEY, builder.entries)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Returns a new context with empty correlations
|
32
|
+
#
|
33
|
+
# @param [optional Context] context Context to clear correlations from. Defaults
|
34
|
+
# to +Context.current+
|
35
|
+
# @return [Context]
|
36
|
+
def clear(context: Context.current)
|
37
|
+
context.set_value(CORRELATION_CONTEXT_KEY, EMPTY_CORRELATION_CONTEXT)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns the corresponding correlation value (or nil) for key
|
41
|
+
#
|
42
|
+
# @param [String] key The lookup key
|
43
|
+
# @param [optional Context] context The context from which to retrieve
|
44
|
+
# the key.
|
45
|
+
# Defaults to +Context.current+
|
46
|
+
# @return [String]
|
47
|
+
def value(key, context: Context.current)
|
48
|
+
correlations_for(context)[key]
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns a new context with new key-value pair
|
52
|
+
#
|
53
|
+
# @param [String] key The key to store this value under
|
54
|
+
# @param [String] value String value to be stored under key
|
55
|
+
# @param [optional Context] context The context to update with new
|
56
|
+
# value. Defaults to +Context.current+
|
57
|
+
# @return [Context]
|
58
|
+
def set_value(key, value, context: Context.current)
|
59
|
+
new_correlations = correlations_for(context).dup
|
60
|
+
new_correlations[key] = value
|
61
|
+
context.set_value(CORRELATION_CONTEXT_KEY, new_correlations)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Returns a new context with value at key removed
|
65
|
+
#
|
66
|
+
# @param [String] key The key to remove
|
67
|
+
# @param [optional Context] context The context to remove correlation
|
68
|
+
# from. Defaults to +Context.current+
|
69
|
+
# @return [Context]
|
70
|
+
def remove_value(key, context: Context.current)
|
71
|
+
correlations = correlations_for(context)
|
72
|
+
return context unless correlations.key?(key)
|
73
|
+
|
74
|
+
new_correlations = correlations.dup
|
75
|
+
new_correlations.delete(key)
|
76
|
+
context.set_value(CORRELATION_CONTEXT_KEY, new_correlations)
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def correlations_for(context)
|
82
|
+
context.value(CORRELATION_CONTEXT_KEY) || EMPTY_CORRELATION_CONTEXT
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2019 OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
# InstrumentationLibrary is a struct containing library information for export.
|
10
|
+
InstrumentationLibrary = Struct.new(:name,
|
11
|
+
:version)
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2019 OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
# @api private
|
10
|
+
#
|
11
|
+
# Internal contains helpers used by the reference implementation.
|
12
|
+
module Internal
|
13
|
+
extend self
|
14
|
+
|
15
|
+
def boolean?(value)
|
16
|
+
value.is_a?(TrueClass) || value.is_a?(FalseClass)
|
17
|
+
end
|
18
|
+
|
19
|
+
def valid_key?(key)
|
20
|
+
key.instance_of?(String)
|
21
|
+
end
|
22
|
+
|
23
|
+
def valid_simple_value?(value)
|
24
|
+
value.instance_of?(String) || value == false || value == true || value.is_a?(Numeric)
|
25
|
+
end
|
26
|
+
|
27
|
+
def valid_array_value?(value)
|
28
|
+
return false unless value.is_a?(Array)
|
29
|
+
return true if value.empty?
|
30
|
+
|
31
|
+
case value.first
|
32
|
+
when String
|
33
|
+
value.all? { |v| v.instance_of?(String) }
|
34
|
+
when TrueClass, FalseClass
|
35
|
+
value.all? { |v| boolean?(v) }
|
36
|
+
when Numeric
|
37
|
+
value.all? { |v| v.is_a?(Numeric) }
|
38
|
+
else
|
39
|
+
false
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def valid_value?(value)
|
44
|
+
valid_simple_value?(value) || valid_array_value?(value)
|
45
|
+
end
|
46
|
+
|
47
|
+
def valid_attributes?(attrs)
|
48
|
+
attrs.nil? || attrs.all? { |k, v| valid_key?(k) && valid_value?(v) }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2019 OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
# Resources contains the {Resource} class.
|
10
|
+
module Resources
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'opentelemetry/sdk/resources/resource'
|
16
|
+
require 'opentelemetry/sdk/resources/constants'
|
@@ -0,0 +1,124 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2020 OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
module Resources
|
10
|
+
module Constants
|
11
|
+
# Attributes describing a service instance.
|
12
|
+
SERVICE_RESOURCE = {
|
13
|
+
# Logical name of the service.
|
14
|
+
name: 'service.name',
|
15
|
+
|
16
|
+
# A namespace for `service.name`.
|
17
|
+
namespace: 'service.namespace',
|
18
|
+
|
19
|
+
# The string ID of the service instance.
|
20
|
+
instance_id: 'service.instance.id',
|
21
|
+
|
22
|
+
# The version string of the service API or implementation.
|
23
|
+
version: 'service.version'
|
24
|
+
}.freeze
|
25
|
+
|
26
|
+
# Attributes describing the telemetry library.
|
27
|
+
TELEMETRY_SDK_RESOURCE = {
|
28
|
+
# The name of the telemetry library.
|
29
|
+
name: 'telemetry.sdk.name',
|
30
|
+
|
31
|
+
# The language of the telemetry library and of the code instrumented with it.
|
32
|
+
language: 'telemetry.sdk.language',
|
33
|
+
|
34
|
+
# The version string of the telemetry library
|
35
|
+
version: 'telemetry.sdk.version'
|
36
|
+
}.freeze
|
37
|
+
|
38
|
+
# Attributes defining a compute unit (e.g. Container, Process, Lambda
|
39
|
+
# Function).
|
40
|
+
CONTAINER_RESOURCE = {
|
41
|
+
# The container name.
|
42
|
+
name: 'container.name',
|
43
|
+
|
44
|
+
# The name of the image the container was built on.
|
45
|
+
image_name: 'container.image.name',
|
46
|
+
|
47
|
+
# The container image tag.
|
48
|
+
image_tag: 'container.image.tag'
|
49
|
+
}.freeze
|
50
|
+
|
51
|
+
FAAS_RESOURCE = {
|
52
|
+
# The name of the function being executed.
|
53
|
+
name: 'faas.name',
|
54
|
+
|
55
|
+
# The unique name of the function being executed.
|
56
|
+
id: 'faas.id',
|
57
|
+
|
58
|
+
# The version string of the function being executed.
|
59
|
+
version: 'faas.version',
|
60
|
+
|
61
|
+
# The execution environment ID as a string.
|
62
|
+
instance: 'faas.instance'
|
63
|
+
}.freeze
|
64
|
+
|
65
|
+
# Attributes defining a deployment service (e.g. Kubernetes).
|
66
|
+
K8S_RESOURCE = {
|
67
|
+
# The name of the cluster that the pod is running in.
|
68
|
+
cluster_name: 'k8s.cluster.name',
|
69
|
+
|
70
|
+
# The name of the namespace that the pod is running in.
|
71
|
+
namespace_name: 'k8s.namespace.name',
|
72
|
+
|
73
|
+
# The name of the pod.
|
74
|
+
pod_name: 'k8s.pod.name',
|
75
|
+
|
76
|
+
# The name of the deployment.
|
77
|
+
deployment_name: 'k8s.deployment.name'
|
78
|
+
}.freeze
|
79
|
+
|
80
|
+
# Attributes defining a computing instance (e.g. host).
|
81
|
+
HOST_RESOURCE = {
|
82
|
+
# Hostname of the host. It contains what the hostname command returns on the
|
83
|
+
# host machine.
|
84
|
+
hostname: 'host.hostname',
|
85
|
+
|
86
|
+
# Unique host id. For Cloud this must be the instance_id assigned by the
|
87
|
+
# cloud provider
|
88
|
+
id: 'host.id',
|
89
|
+
|
90
|
+
# Name of the host. It may contain what hostname returns on Unix systems,
|
91
|
+
# the fully qualified, or a name specified by the user.
|
92
|
+
name: 'host.name',
|
93
|
+
|
94
|
+
# Type of host. For Cloud this must be the machine type.
|
95
|
+
type: 'host.type',
|
96
|
+
|
97
|
+
# Name of the VM image or OS install the host was instantiated from.
|
98
|
+
image_name: 'host.image.name',
|
99
|
+
|
100
|
+
# VM image id. For Cloud, this value is from the provider.
|
101
|
+
image_id: 'host.image.id',
|
102
|
+
|
103
|
+
# The version string of the VM image.
|
104
|
+
image_version: 'host.image.version'
|
105
|
+
}.freeze
|
106
|
+
|
107
|
+
# Attributes defining a running environment (e.g. Cloud, Data Center).
|
108
|
+
CLOUD_RESOURCE = {
|
109
|
+
# Name of the cloud provider. Example values are aws, azure, gcp.
|
110
|
+
provider: 'cloud.provider',
|
111
|
+
|
112
|
+
# The cloud account id used to identify different entities.
|
113
|
+
account_id: 'cloud.account.id',
|
114
|
+
|
115
|
+
# A specific geographical location where different entities can run.
|
116
|
+
region: 'cloud.region',
|
117
|
+
|
118
|
+
# Zones are a sub set of the region connected through low-latency links.
|
119
|
+
zone: 'cloud.zone'
|
120
|
+
}.freeze
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2019 OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
module Resources
|
10
|
+
# Resource represents a resource, which captures identifying information about the entities
|
11
|
+
# for which telemetry (metrics or traces) is reported.
|
12
|
+
class Resource
|
13
|
+
class << self
|
14
|
+
private :new # rubocop:disable Style/AccessModifierDeclarations
|
15
|
+
|
16
|
+
# Returns a newly created {Resource} with the specified labels
|
17
|
+
#
|
18
|
+
# @param [Hash{String => String, Numeric, Boolean} labels Hash of key-value pairs to be used
|
19
|
+
# as labels for this resource
|
20
|
+
# @raise [ArgumentError] If label keys and values are not strings
|
21
|
+
# @return [Resource]
|
22
|
+
def create(labels = {})
|
23
|
+
frozen_labels = labels.each_with_object({}) do |(k, v), memo|
|
24
|
+
raise ArgumentError, 'label keys must be strings' unless k.is_a?(String)
|
25
|
+
raise ArgumentError, 'label values must be strings, integers, floats, or booleans' unless Internal.valid_value?(v)
|
26
|
+
|
27
|
+
memo[-k] = v.freeze
|
28
|
+
end.freeze
|
29
|
+
|
30
|
+
new(frozen_labels)
|
31
|
+
end
|
32
|
+
|
33
|
+
def telemetry_sdk
|
34
|
+
create(
|
35
|
+
Constants::TELEMETRY_SDK_RESOURCE[:name] => 'opentelemetry',
|
36
|
+
Constants::TELEMETRY_SDK_RESOURCE[:language] => 'ruby',
|
37
|
+
Constants::TELEMETRY_SDK_RESOURCE[:version] => "semver:#{OpenTelemetry::SDK::VERSION}"
|
38
|
+
)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# @api private
|
43
|
+
# The constructor is private and only for use internally by the class.
|
44
|
+
# Users should use the {create} factory method to obtain a {Resource}
|
45
|
+
# instance.
|
46
|
+
#
|
47
|
+
# @param [Hash<String, String>] frozen_labels Frozen-hash of frozen-string
|
48
|
+
# key-value pairs to be used as labels for this resource
|
49
|
+
# @return [Resource]
|
50
|
+
def initialize(frozen_labels)
|
51
|
+
@labels = frozen_labels
|
52
|
+
end
|
53
|
+
|
54
|
+
# Returns an enumerator for labels of this {Resource}
|
55
|
+
#
|
56
|
+
# @return [Enumerator]
|
57
|
+
def label_enumerator
|
58
|
+
@label_enumerator ||= labels.to_enum
|
59
|
+
end
|
60
|
+
|
61
|
+
# Returns a new, merged {Resource} by merging the current {Resource} with
|
62
|
+
# the other {Resource}. In case of a collision, the current {Resource}
|
63
|
+
# takes precedence
|
64
|
+
#
|
65
|
+
# @param [Resource] other The other resource to merge
|
66
|
+
# @return [Resource] A new resource formed by merging the current resource
|
67
|
+
# with other
|
68
|
+
def merge(other)
|
69
|
+
return self unless other.is_a?(Resource)
|
70
|
+
|
71
|
+
merged_labels = labels.merge(other.labels) do |_, old_v, new_v|
|
72
|
+
old_v.empty? ? new_v : old_v
|
73
|
+
end
|
74
|
+
|
75
|
+
self.class.send(:new, merged_labels.freeze)
|
76
|
+
end
|
77
|
+
|
78
|
+
protected
|
79
|
+
|
80
|
+
attr_reader :labels
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2019 OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
# The Trace module contains the OpenTelemetry tracing reference
|
10
|
+
# implementation.
|
11
|
+
module Trace
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
require 'opentelemetry/sdk/trace/samplers'
|
17
|
+
require 'opentelemetry/sdk/trace/config'
|
18
|
+
require 'opentelemetry/sdk/trace/export'
|
19
|
+
require 'opentelemetry/sdk/trace/multi_span_processor'
|
20
|
+
require 'opentelemetry/sdk/trace/noop_span_processor'
|
21
|
+
require 'opentelemetry/sdk/trace/span_data'
|
22
|
+
require 'opentelemetry/sdk/trace/span'
|
23
|
+
require 'opentelemetry/sdk/trace/tracer'
|
24
|
+
require 'opentelemetry/sdk/trace/tracer_provider'
|