Skip to content

Commit 816ee5a

Browse files
[currencyservice] Add OTLP logs (#1378)
* Add OTel logs to currencyservice * line break * changelog * Move OPENTELEMETRY_CPP_VERSION back * set opensearch version and timestamp field Signed-off-by: Pierre Tessier <pierre@pierretessier.com> * add comment for opensearch version update Signed-off-by: Pierre Tessier <pierre@pierretessier.com> * Change log to INFO --------- Signed-off-by: Pierre Tessier <pierre@pierretessier.com> Co-authored-by: Pierre Tessier <pierre@pierretessier.com>
1 parent 371b36f commit 816ee5a

File tree

8 files changed

+62
-24
lines changed

8 files changed

+62
-24
lines changed

.env

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ IMAGE_NAME=ghcr.io/open-telemetry/demo
88
COLLECTOR_CONTRIB_IMAGE=otel/opentelemetry-collector-contrib:0.93.0
99
GRAFANA_IMAGE=grafana/grafana:10.3.1
1010
JAEGERTRACING_IMAGE=jaegertracing/all-in-one:1.53
11+
# must also update version field in /src/grafana/provisioning/datasources/opensearch.yml
1112
OPENSEARCH_IMAGE=opensearchproject/opensearch:2.11.1
1213
POSTGRES_IMAGE=postgres:16.1
1314
PROMETHEUS_IMAGE=quay.io/prometheus/prometheus:v2.49.1

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ the release.
5454
([#1363](https://github.com/open-telemetry/opentelemetry-demo/pull/1363))
5555
* [tests] update trace based tests for semantic conventions
5656
([#1377](https://github.com/open-telemetry/opentelemetry-demo/pull/1377))
57+
* [currencyservice] Add OTLP logs
58+
([#1378](https://github.com/open-telemetry/opentelemetry-demo/pull/1378))
5759
* [cartservice] update .NET to .NET 8.0.2
5860
([#1380](https://github.com/open-telemetry/opentelemetry-demo/pull/1380))
5961

docker-compose.minimal.yml

+1-3
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,6 @@ services:
129129
context: ./src/currencyservice
130130
cache_from:
131131
- ${IMAGE_NAME}:${IMAGE_VERSION}-currencyservice
132-
args:
133-
- GRPC_VERSION=1.46.0
134-
- OPENTELEMETRY_VERSION=1.5.0
135132
deploy:
136133
resources:
137134
limits:
@@ -141,6 +138,7 @@ services:
141138
- "${CURRENCY_SERVICE_PORT}"
142139
environment:
143140
- CURRENCY_SERVICE_PORT
141+
- VERSION=${IMAGE_VERSION}
144142
- OTEL_EXPORTER_OTLP_ENDPOINT
145143
- OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.name=currencyservice # The C++ SDK does not support OTEL_SERVICE_NAME
146144
depends_on:

docker-compose.yml

+1-3
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,6 @@ services:
160160
context: ./src/currencyservice
161161
cache_from:
162162
- ${IMAGE_NAME}:${IMAGE_VERSION}-currencyservice
163-
args:
164-
- GRPC_VERSION=1.46.0
165-
- OPENTELEMETRY_VERSION=1.5.0
166163
deploy:
167164
resources:
168165
limits:
@@ -172,6 +169,7 @@ services:
172169
- "${CURRENCY_SERVICE_PORT}"
173170
environment:
174171
- CURRENCY_SERVICE_PORT
172+
- VERSION=${IMAGE_VERSION}
175173
- OTEL_EXPORTER_OTLP_ENDPOINT
176174
- OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.name=currencyservice # The C++ SDK does not support OTEL_SERVICE_NAME
177175
depends_on:
+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#include "opentelemetry/exporters/otlp/otlp_grpc_exporter_factory.h"
5+
#include "opentelemetry/logs/provider.h"
6+
#include "opentelemetry/sdk/logs/logger.h"
7+
#include "opentelemetry/sdk/logs/logger_provider_factory.h"
8+
#include "opentelemetry/sdk/logs/simple_log_record_processor_factory.h"
9+
#include "opentelemetry/sdk/logs/logger_context_factory.h"
10+
#include "opentelemetry/exporters/otlp/otlp_grpc_log_record_exporter_factory.h"
11+
12+
using namespace std;
13+
namespace nostd = opentelemetry::nostd;
14+
namespace otlp = opentelemetry::exporter::otlp;
15+
namespace logs = opentelemetry::logs;
16+
namespace logs_sdk = opentelemetry::sdk::logs;
17+
18+
namespace
19+
{
20+
void initLogger() {
21+
otlp::OtlpGrpcLogRecordExporterOptions loggerOptions;
22+
auto exporter = otlp::OtlpGrpcLogRecordExporterFactory::Create(loggerOptions);
23+
auto processor = logs_sdk::SimpleLogRecordProcessorFactory::Create(std::move(exporter));
24+
std::vector<std::unique_ptr<logs_sdk::LogRecordProcessor>> processors;
25+
processors.push_back(std::move(processor));
26+
auto context = logs_sdk::LoggerContextFactory::Create(std::move(processors));
27+
std::shared_ptr<logs::LoggerProvider> provider = logs_sdk::LoggerProviderFactory::Create(std::move(context));
28+
opentelemetry::logs::Provider::SetLoggerProvider(provider);
29+
}
30+
31+
nostd::shared_ptr<opentelemetry::logs::Logger> getLogger(std::string name){
32+
auto provider = logs::Provider::GetLoggerProvider();
33+
return provider->GetLogger(name + "_logger", name, OPENTELEMETRY_SDK_VERSION);
34+
}
35+
}

src/currencyservice/src/meter_common.h

+1-9
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,14 @@ namespace otlp_exporter = opentelemetry::exporter::otlp;
1616

1717
namespace
1818
{
19-
std::string version{ "1.3.0" };
20-
std::string name{ "app_currency" };
21-
std::string schema{ "https://opentelemetry.io/schemas/1.2.0" };
22-
2319
void initMeter()
2420
{
2521
// Build MetricExporter
2622
otlp_exporter::OtlpGrpcMetricExporterOptions otlpOptions;
27-
// Configuration via environment variable not supported yet
28-
//otlpOptions.aggregation_temporality = otlp_exporter::PreferredAggregationTemporality::kCumulative;
2923
auto exporter = otlp_exporter::OtlpGrpcMetricExporterFactory::Create(otlpOptions);
3024

3125
// Build MeterProvider and Reader
3226
metric_sdk::PeriodicExportingMetricReaderOptions options;
33-
//options.export_interval_millis = std::chrono::milliseconds(60000);
34-
//options.export_timeout_millis = std::chrono::milliseconds(30000);
3527
std::unique_ptr<metric_sdk::MetricReader> reader{
3628
new metric_sdk::PeriodicExportingMetricReader(std::move(exporter), options) };
3729
auto provider = std::shared_ptr<metrics_api::MeterProvider>(new metric_sdk::MeterProvider());
@@ -40,7 +32,7 @@ namespace
4032
metrics_api::Provider::SetMeterProvider(provider);
4133
}
4234

43-
nostd::unique_ptr<metrics_api::Counter<uint64_t>> initIntCounter()
35+
nostd::unique_ptr<metrics_api::Counter<uint64_t>> initIntCounter(std::string name, std::string version)
4436
{
4537
std::string counter_name = name + "_counter";
4638
auto provider = metrics_api::Provider::GetMeterProvider();

src/currencyservice/src/server.cpp

+19-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright The OpenTelemetry Authors
22
// SPDX-License-Identifier: Apache-2.0
33

4+
#include <cstdlib>
45
#include <iostream>
56
#include <math.h>
67
#include <demo.grpc.pb.h>
@@ -11,6 +12,7 @@
1112
#include "opentelemetry/trace/span_context_kv_iterable_view.h"
1213
#include "opentelemetry/baggage/baggage.h"
1314
#include "opentelemetry/nostd/string_view.h"
15+
#include "logger_common.h"
1416
#include "meter_common.h"
1517
#include "tracer_common.h"
1618

@@ -80,7 +82,11 @@ namespace
8082
{"ZAR", 16.0583},
8183
};
8284

85+
std::string version = std::getenv("VERSION");
86+
std::string name{ "currencyservice" };
87+
8388
nostd::unique_ptr<metrics_api::Counter<uint64_t>> currency_counter;
89+
nostd::shared_ptr<opentelemetry::logs::Logger> logger;
8490

8591
class HealthServer final : public grpc::health::v1::Health::Service
8692
{
@@ -127,10 +133,11 @@ class CurrencyService final : public oteldemo::CurrencyService::Service
127133

128134
span->AddEvent("Currencies fetched, response sent back");
129135
span->SetStatus(StatusCode::kOk);
136+
137+
logger->Info(std::string(__func__) + " successful");
138+
130139
// Make sure to end your spans!
131140
span->End();
132-
133-
std::cout << __func__ << " successful" << std::endl;
134141
return Status::OK;
135142
}
136143

@@ -203,14 +210,18 @@ class CurrencyService final : public oteldemo::CurrencyService::Service
203210
// End the span
204211
span->AddEvent("Conversion successful, response sent back");
205212
span->SetStatus(StatusCode::kOk);
206-
std::cout << __func__ << " conversion successful" << std::endl;
213+
214+
logger->Info(std::string(__func__) + " conversion successful");
215+
207216
span->End();
208217
return Status::OK;
209218

210219
} catch(...) {
211220
span->AddEvent("Conversion failed");
212221
span->SetStatus(StatusCode::kError);
213-
std::cout << __func__ << " conversion failure" << std::endl;
222+
223+
logger->Error(std::string(__func__) + " conversion failure");
224+
214225
span->End();
215226
return Status::CANCELLED;
216227
}
@@ -237,7 +248,7 @@ void RunServer(uint16_t port)
237248
builder.AddListeningPort(address, grpc::InsecureServerCredentials());
238249

239250
std::unique_ptr<Server> server(builder.BuildAndStart());
240-
std::cout << "Currency Server listening on port: " << address << std::endl;
251+
logger->Info("Currency Server listening on port: " + address);
241252
server->Wait();
242253
server->Shutdown();
243254
}
@@ -252,11 +263,11 @@ int main(int argc, char **argv) {
252263

253264
uint16_t port = atoi(argv[1]);
254265

255-
std::cout << "Port: " << port << "\n";
256-
257266
initTracer();
258267
initMeter();
259-
currency_counter = initIntCounter();
268+
initLogger();
269+
currency_counter = initIntCounter(name, version);
270+
logger = getLogger(name);
260271
RunServer(port);
261272

262273
return 0;

src/grafana/provisioning/datasources/opensearch.yaml

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ datasources:
1616
logLevelField: severity
1717
logMessageField: body
1818
pplEnabled: true
19-
timeField: "@timestamp"
19+
timeField: observedTimestamp
20+
version: 2.11.1

0 commit comments

Comments
 (0)