1
#include "source/extensions/tracers/opentelemetry/otlp_utils.h"
2

            
3
#include <cstdint>
4
#include <string>
5

            
6
#include "envoy/common/exception.h"
7

            
8
#include "source/common/common/fmt.h"
9
#include "source/common/common/macros.h"
10
#include "source/common/version/version.h"
11

            
12
namespace Envoy {
13
namespace Extensions {
14
namespace Tracers {
15
namespace OpenTelemetry {
16

            
17
enum OTelAttributeType {
18
  KTypeBool,
19
  KTypeInt,
20
  KTypeUInt,
21
  KTypeInt64,
22
  KTypeDouble,
23
  KTypeString,
24
  KTypeStringView,
25
  KTypeSpanBool,
26
  KTypeSpanInt,
27
  KTypeSpanUInt,
28
  KTypeSpanInt64,
29
  KTypeSpanDouble,
30
  KTypeSpanString,
31
  KTypeSpanStringView,
32
  KTypeUInt64,
33
  KTypeSpanUInt64,
34
  KTypeSpanByte
35
};
36

            
37
17
const std::string& OtlpUtils::getOtlpUserAgentHeader() {
38
17
  CONSTRUCT_ON_FIRST_USE(std::string,
39
17
                         fmt::format("OTel-OTLP-Exporter-Envoy/{}", Envoy::VersionInfo::version()));
40
17
}
41

            
42
void OtlpUtils::populateAnyValue(opentelemetry::proto::common::v1::AnyValue& value_proto,
43
672
                                 const OTelAttribute& attribute_value) {
44
672
  switch (attribute_value.index()) {
45
1
  case OTelAttributeType::KTypeBool:
46
1
    value_proto.set_bool_value(opentelemetry::nostd::get<bool>(attribute_value) ? true : false);
47
1
    break;
48
1
  case OTelAttributeType::KTypeInt:
49
1
    value_proto.set_int_value(opentelemetry::nostd::get<int32_t>(attribute_value));
50
1
    break;
51
1
  case OTelAttributeType::KTypeInt64:
52
1
    value_proto.set_int_value(opentelemetry::nostd::get<int64_t>(attribute_value));
53
1
    break;
54
5
  case OTelAttributeType::KTypeUInt:
55
5
    value_proto.set_int_value(opentelemetry::nostd::get<uint32_t>(attribute_value));
56
5
    break;
57
1
  case OTelAttributeType::KTypeUInt64:
58
1
    value_proto.set_int_value(opentelemetry::nostd::get<uint64_t>(attribute_value));
59
1
    break;
60
1
  case OTelAttributeType::KTypeDouble:
61
1
    value_proto.set_double_value(opentelemetry::nostd::get<double>(attribute_value));
62
1
    break;
63
1
  case OTelAttributeType::KTypeString: {
64
1
    const auto sv = opentelemetry::nostd::get<std::string>(attribute_value);
65
1
    value_proto.set_string_value(sv.data(), sv.size());
66
1
    break;
67
  }
68
656
  case OTelAttributeType::KTypeStringView: {
69
656
    const auto sv = opentelemetry::nostd::get<absl::string_view>(attribute_value);
70
656
    value_proto.set_string_value(sv.data(), sv.size());
71
656
    break;
72
  }
73
1
  case OTelAttributeType::KTypeSpanString: {
74
1
    auto array_value = value_proto.mutable_array_value();
75
2
    for (const auto& val : opentelemetry::nostd::get<std::vector<std::string>>(attribute_value)) {
76
2
      array_value->add_values()->set_string_value(val.data(), val.size());
77
2
    }
78
1
    break;
79
  }
80
4
  case OTelAttributeType::KTypeSpanStringView: {
81
4
    auto array_value = value_proto.mutable_array_value();
82
4
    for (const auto& val :
83
5
         opentelemetry::nostd::get<std::vector<absl::string_view>>(attribute_value)) {
84
5
      array_value->add_values()->set_string_value(val.data(), val.size());
85
5
    }
86
4
    break;
87
  }
88
  default:
89
    IS_ENVOY_BUG("unexpected otel attribute type");
90
672
  }
91
672
}
92

            
93
} // namespace OpenTelemetry
94
} // namespace Tracers
95
} // namespace Extensions
96
} // namespace Envoy