File: telemetry.rb

package info (click to toggle)
ruby-aws-sdk-core 3.242.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,420 kB
  • sloc: ruby: 18,795; makefile: 4
file content (75 lines) | stat: -rw-r--r-- 2,463 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# frozen_string_literal: true

module Aws
  module Plugins
    # @api private
    class Telemetry < Seahorse::Client::Plugin
      option(
        :telemetry_provider,
        default: Aws::Telemetry::NoOpTelemetryProvider,
        doc_type: Aws::Telemetry::TelemetryProviderBase,
        rbs_type: Aws::Telemetry::TelemetryProviderBase,
        docstring: <<-DOCS) do |_cfg|
Allows you to provide a telemetry provider, which is used to 
emit telemetry data. By default, uses `NoOpTelemetryProvider` which 
will not record or emit any telemetry data. The SDK supports the 
following telemetry providers:

* OpenTelemetry (OTel) - To use the OTel provider, install and require the 
`opentelemetry-sdk` gem and then, pass in an instance of a 
`Aws::Telemetry::OTelProvider` for telemetry provider.
        DOCS
        Aws::Telemetry::NoOpTelemetryProvider.new
      end

      def after_initialize(client)
        validate_telemetry_provider(client.config)
      end

      def validate_telemetry_provider(config)
        unless config.telemetry_provider.is_a?(Aws::Telemetry::TelemetryProviderBase)
          raise ArgumentError,
                'Must provide a telemetry provider for the '\
                '`telemetry_provider` configuration option.'
        end
      end

      class Handler < Seahorse::Client::Handler
        def call(context)
          span_wrapper(context) { @handler.call(context) }
        end

        private

        def span_wrapper(context, &block)
          service_id = service_id(context)
          attributes = {
            'rpc.system' => 'aws-api',
            'rpc.service' => service_id,
            'rpc.method' => context.operation.name,
            'code.function' => context.operation_name.to_s,
            'code.namespace' => 'Aws::Plugins::Telemetry'
          }
          context.tracer.in_span(
            parent_span_name(context, service_id),
            attributes: attributes,
            kind: Aws::Telemetry::SpanKind::CLIENT,
            &block
          )
        end

        def service_id(context)
          context.config.api.metadata['serviceId'] ||
            context.config.api.metadata['serviceAbbreviation'] ||
            context.config.api.metadata['serviceFullName']
        end

        def parent_span_name(context, service_id)
          "#{service_id}.#{context.operation.name}".delete(' ')
        end
      end

      handler(Handler, step: :initialize, priority: 99)
    end
  end
end