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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
#include "opentelemetry/ext/http/client/http_client_factory.h"
#include "opentelemetry/ext/http/common/url_parser.h"
#include "opentelemetry/trace/experimental_semantic_conventions.h"
#include "tracer_common.h"
namespace
{
using namespace opentelemetry::trace;
namespace http_client = opentelemetry::ext::http::client;
namespace context = opentelemetry::context;
namespace nostd = opentelemetry::nostd;
void sendRequest(const std::string &url)
{
auto http_client = http_client::HttpClientFactory::CreateSync();
// start active span
StartSpanOptions options;
options.kind = SpanKind::kClient; // client
opentelemetry::ext::http::common::UrlParser url_parser(url);
std::string span_name = url_parser.path_;
auto span = get_tracer("http-client")
->StartSpan(span_name,
{{OTEL_GET_TRACE_ATTR(AttrHttpUrl), url_parser.url_},
{OTEL_GET_TRACE_ATTR(AttrHttpScheme), url_parser.scheme_},
{OTEL_GET_TRACE_ATTR(AttrHttpMethod), "GET"}},
options);
auto scope = get_tracer("http-client")->WithActiveSpan(span);
// inject current context into http header
auto current_ctx = context::RuntimeContext::GetCurrent();
HttpTextMapCarrier<http_client::Headers> carrier;
auto prop = context::propagation::GlobalTextMapPropagator::GetGlobalPropagator();
prop->Inject(carrier, current_ctx);
// send http request
http_client::Result result = http_client->Get(url, carrier.headers_);
if (result)
{
// set span attributes
auto status_code = result.GetResponse().GetStatusCode();
span->SetAttribute(OTEL_GET_TRACE_ATTR(AttrHttpStatusCode), status_code);
result.GetResponse().ForEachHeader(
[&span](nostd::string_view header_name, nostd::string_view header_value) {
span->SetAttribute("http.header." + std::string(header_name.data()), header_value);
return true;
});
if (status_code >= 400)
{
span->SetStatus(StatusCode::kError);
}
}
else
{
span->SetStatus(
StatusCode::kError,
"Response Status :" +
std::to_string(
static_cast<typename std::underlying_type<http_client::SessionState>::type>(
result.GetSessionState())));
}
// end span and export data
span->End();
}
} // namespace
int main(int argc, char *argv[])
{
initTracer();
constexpr char default_host[] = "localhost";
constexpr char default_path[] = "/helloworld";
constexpr uint16_t default_port = 8800;
uint16_t port;
// The port the validation service listens to can be specified via the command line.
if (argc > 1)
{
port = atoi(argv[1]);
}
else
{
port = default_port;
}
std::string url = "http://" + std::string(default_host) + ":" + std::to_string(port) +
std::string(default_path);
sendRequest(url);
}
|