Coverage Report

Created: 2024-09-19 09:45

/proc/self/cwd/source/common/tracing/tracer_impl.cc
Line
Count
Source (jump to first uncovered line)
1
#include "source/common/tracing/tracer_impl.h"
2
3
#include "envoy/upstream/upstream.h"
4
5
#include "source/common/stream_info/utility.h"
6
7
#include "absl/strings/str_cat.h"
8
9
namespace Envoy {
10
namespace Tracing {
11
12
namespace {
13
14
0
static void annotateVerbose(Span& span, const StreamInfo::StreamInfo& stream_info) {
15
0
  const auto start_time = stream_info.startTime();
16
0
  StreamInfo::TimingUtility timing(stream_info);
17
0
  if (timing.lastDownstreamRxByteReceived()) {
18
0
    span.log(start_time + std::chrono::duration_cast<SystemTime::duration>(
19
0
                              *timing.lastDownstreamRxByteReceived()),
20
0
             Tracing::Logs::get().LastDownstreamRxByteReceived);
21
0
  }
22
0
  if (timing.firstUpstreamTxByteSent()) {
23
0
    span.log(start_time + std::chrono::duration_cast<SystemTime::duration>(
24
0
                              *timing.firstUpstreamTxByteSent()),
25
0
             Tracing::Logs::get().FirstUpstreamTxByteSent);
26
0
  }
27
0
  if (timing.lastUpstreamTxByteSent()) {
28
0
    span.log(start_time +
29
0
                 std::chrono::duration_cast<SystemTime::duration>(*timing.lastUpstreamTxByteSent()),
30
0
             Tracing::Logs::get().LastUpstreamTxByteSent);
31
0
  }
32
0
  if (timing.firstUpstreamRxByteReceived()) {
33
0
    span.log(start_time + std::chrono::duration_cast<SystemTime::duration>(
34
0
                              *timing.firstUpstreamRxByteReceived()),
35
0
             Tracing::Logs::get().FirstUpstreamRxByteReceived);
36
0
  }
37
0
  if (timing.lastUpstreamRxByteReceived()) {
38
0
    span.log(start_time + std::chrono::duration_cast<SystemTime::duration>(
39
0
                              *timing.lastUpstreamRxByteReceived()),
40
0
             Tracing::Logs::get().LastUpstreamRxByteReceived);
41
0
  }
42
0
  if (timing.firstDownstreamTxByteSent()) {
43
0
    span.log(start_time + std::chrono::duration_cast<SystemTime::duration>(
44
0
                              *timing.firstDownstreamTxByteSent()),
45
0
             Tracing::Logs::get().FirstDownstreamTxByteSent);
46
0
  }
47
0
  if (timing.lastDownstreamTxByteSent()) {
48
0
    span.log(start_time + std::chrono::duration_cast<SystemTime::duration>(
49
0
                              *timing.lastDownstreamTxByteSent()),
50
0
             Tracing::Logs::get().LastDownstreamTxByteSent);
51
0
  }
52
0
}
53
54
} // namespace
55
56
const std::string TracerUtility::IngressOperation = "ingress";
57
const std::string TracerUtility::EgressOperation = "egress";
58
59
0
const std::string& TracerUtility::toString(OperationName operation_name) {
60
0
  switch (operation_name) {
61
0
  case OperationName::Ingress:
62
0
    return IngressOperation;
63
0
  case OperationName::Egress:
64
0
    return EgressOperation;
65
0
  }
66
67
0
  return EMPTY_STRING; // Make the compiler happy.
68
0
}
69
70
888
Decision TracerUtility::shouldTraceRequest(const StreamInfo::StreamInfo& stream_info) {
71
  // Exclude health check requests immediately.
72
888
  if (stream_info.healthCheck()) {
73
0
    return {Reason::HealthCheck, false};
74
0
  }
75
76
888
  const Tracing::Reason trace_reason = stream_info.traceReason();
77
888
  switch (trace_reason) {
78
0
  case Reason::ClientForced:
79
0
  case Reason::ServiceForced:
80
0
  case Reason::Sampling:
81
0
    return {trace_reason, true};
82
888
  default:
83
888
    return {trace_reason, false};
84
888
  }
85
888
}
86
87
void TracerUtility::finalizeSpan(Span& span, const TraceContext& trace_context,
88
                                 const StreamInfo::StreamInfo& stream_info,
89
0
                                 const Config& tracing_config, bool upstream_span) {
90
0
  span.setTag(Tracing::Tags::get().Component, Tracing::Tags::get().Proxy);
91
92
  // Response flag.
93
0
  span.setTag(Tracing::Tags::get().ResponseFlags,
94
0
              StreamInfo::ResponseFlagUtils::toShortString(stream_info));
95
96
  // Downstream info.
97
0
  if (!upstream_span) {
98
0
    const auto& remote_address = stream_info.downstreamAddressProvider().directRemoteAddress();
99
0
    span.setTag(Tracing::Tags::get().PeerAddress, remote_address->asStringView());
100
0
  }
101
102
  // Cluster info.
103
0
  if (auto cluster_info = stream_info.upstreamClusterInfo();
104
0
      cluster_info.has_value() && cluster_info.value() != nullptr) {
105
0
    span.setTag(Tracing::Tags::get().UpstreamCluster, cluster_info.value()->name());
106
0
    span.setTag(Tracing::Tags::get().UpstreamClusterName,
107
0
                cluster_info.value()->observabilityName());
108
0
  }
109
110
  // Upstream info.
111
0
  if (stream_info.upstreamInfo() && stream_info.upstreamInfo()->upstreamHost()) {
112
0
    auto upstream_address = stream_info.upstreamInfo()->upstreamHost()->address();
113
114
0
    span.setTag(Tracing::Tags::get().UpstreamAddress, upstream_address->asStringView());
115
116
    // Upstream address would be 'peer.address' in the case of an upstream span.
117
0
    if (upstream_span) {
118
0
      span.setTag(Tracing::Tags::get().PeerAddress, upstream_address->asStringView());
119
0
    }
120
0
  }
121
122
  // Verbose timing log.
123
0
  if (tracing_config.verbose()) {
124
0
    annotateVerbose(span, stream_info);
125
0
  }
126
127
  // Custom tag from configuration.
128
0
  CustomTagContext ctx{trace_context, stream_info};
129
0
  if (const CustomTagMap* custom_tag_map = tracing_config.customTags(); custom_tag_map) {
130
0
    for (const auto& it : *custom_tag_map) {
131
0
      it.second->applySpan(span, ctx);
132
0
    }
133
0
  }
134
135
  // Finish the span.
136
0
  span.finishSpan();
137
0
}
138
139
TracerImpl::TracerImpl(DriverSharedPtr driver, const LocalInfo::LocalInfo& local_info)
140
0
    : driver_(std::move(driver)), local_info_(local_info) {}
141
142
SpanPtr TracerImpl::startSpan(const Config& config, TraceContext& trace_context,
143
                              const StreamInfo::StreamInfo& stream_info,
144
0
                              const Tracing::Decision tracing_decision) {
145
0
  std::string span_name = TracerUtility::toString(config.operationName());
146
147
0
  if (config.operationName() == OperationName::Egress) {
148
0
    span_name.append(" ");
149
0
    span_name.append(std::string(trace_context.host()));
150
0
  }
151
152
0
  SpanPtr active_span =
153
0
      driver_->startSpan(config, trace_context, stream_info, span_name, tracing_decision);
154
155
  // Set tags related to the local environment
156
0
  if (active_span) {
157
0
    active_span->setTag(Tracing::Tags::get().NodeId, local_info_.nodeName());
158
0
    active_span->setTag(Tracing::Tags::get().Zone, local_info_.zoneName());
159
0
  }
160
161
0
  return active_span;
162
0
}
163
164
} // namespace Tracing
165
} // namespace Envoy