Skip to content

Commit

Permalink
Merge branch 'main' into nit-histogram-var-fix
Browse files Browse the repository at this point in the history
  • Loading branch information
lalitb authored Feb 16, 2023
2 parents 7578c6c + a6211fa commit 7f5b8e0
Show file tree
Hide file tree
Showing 7 changed files with 54 additions and 33 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ Increment the:
* [CI] Enforce copyright check in CI [#1965](https://github.com/open-telemetry/opentelemetry-cpp/pull/1965)
* [SEMANTIC CONVENTIONS] Upgrade to version 1.18.0
[#1974](https://github.com/open-telemetry/opentelemetry-cpp/pull/1974)
* Fix Prometheus server crash on listening to already used port [#1986](https://github.com/open-telemetry/opentelemetry-cpp/pull/1986)

## [1.8.2] 2023-01-31

Expand Down
24 changes: 2 additions & 22 deletions examples/prometheus/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,31 +11,12 @@

## Export metrics from the application

It is highly recommended to go over the [ostream-metrics](../metrics_simple/README.md)
doc before following along this document.

Run the application with:

```sh
bazel run //examples/prometheus:prometheus_example
```

The main difference between the [ostream-metrics](../metrics_simple/README.md)
example with this one is that the line below is replaced:

```cpp
std::unique_ptr<metric_sdk::PushMetricExporter> exporter{
new exportermetrics::OStreamMetricExporter};

```
with
```cpp
std::unique_ptr<metrics_sdk::PushMetricExporter> exporter{
new metrics_exporter::PrometheusExporter(opts)};
```

OpenTelemetry `PrometheusExporter` will export
data via the endpoint defined by
`metrics_exporter::PrometheusExporterOptions::url`,
Expand All @@ -46,8 +27,7 @@ graph LR
subgraph SDK
MeterProvider
MetricReader[PeriodicExportingMetricReader]
PrometheusExporter["PrometheusExporter<br/>(http://localhost:9464/)"]
MetricReader["PrometheusExporter<br/>(http://localhost:9464/)"]
end
subgraph API
Expand All @@ -56,7 +36,7 @@ end
Instrument --> | Measurements | MeterProvider
MeterProvider --> | Metrics | MetricReader --> | Pull | PrometheusExporter
MeterProvider --> | Metrics | MetricReader
```

Also, for our learning purpose, we use a while-loop to keep recoring random
Expand Down
2 changes: 1 addition & 1 deletion examples/prometheus/main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ void CleanupMetrics()
int main(int argc, char **argv)
{
std::string example_type;
std::string addr{"localhost:8080"};
std::string addr{"localhost:9464"};
if (argc == 1)
{
std::puts("usage: $prometheus_example <example type> <url>");
Expand Down
4 changes: 4 additions & 0 deletions exporters/prometheus/src/collector.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// SPDX-License-Identifier: Apache-2.0

#include "opentelemetry/exporters/prometheus/collector.h"
#include "opentelemetry/sdk/common/global_log_handler.h"

namespace metric_sdk = opentelemetry::sdk::metrics;

Expand All @@ -27,6 +28,9 @@ std::vector<prometheus_client::MetricFamily> PrometheusCollector::Collect() cons
{
if (reader_->IsShutdown())
{
OTEL_INTERNAL_LOG_WARN(
"[Prometheus Exporter] Collect: "
"Exporter is shutdown, can not invoke collect operation.");
return {};
}
collection_lock_.lock();
Expand Down
18 changes: 16 additions & 2 deletions exporters/prometheus/src/exporter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// SPDX-License-Identifier: Apache-2.0

#include "opentelemetry/exporters/prometheus/exporter.h"
#include "opentelemetry/sdk/common/global_log_handler.h"

OPENTELEMETRY_BEGIN_NAMESPACE

Expand All @@ -16,7 +17,19 @@ namespace metrics
*/
PrometheusExporter::PrometheusExporter(const PrometheusExporterOptions &options) : options_(options)
{
exposer_ = std::unique_ptr<::prometheus::Exposer>(new ::prometheus::Exposer{options_.url});
try
{
exposer_ = std::unique_ptr<::prometheus::Exposer>(new ::prometheus::Exposer{options_.url});
}
catch (const std::exception &ex)
{
exposer_.reset(nullptr);
OTEL_INTERNAL_LOG_ERROR("[Prometheus Exporter] "
<< "Can't initialize prometheus exposer with endpoint: " << options_.url
<< "\nError: " << ex.what());
Shutdown(); // set MetricReader in shutdown state.
return;
}
collector_ = std::shared_ptr<PrometheusCollector>(new PrometheusCollector(this));

exposer_->RegisterCollectable(collector_);
Expand All @@ -36,7 +49,8 @@ bool PrometheusExporter::OnForceFlush(std::chrono::microseconds /* timeout */) n

bool PrometheusExporter::OnShutDown(std::chrono::microseconds /* timeout */) noexcept
{
exposer_->RemoveCollectable(collector_);
if (exposer_ != nullptr)
exposer_->RemoveCollectable(collector_);
return true;
}

Expand Down
3 changes: 3 additions & 0 deletions sdk/src/logs/logger.cc
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ nostd::unique_ptr<opentelemetry::logs::LogRecord> Logger::CreateLogRecord() noex
}

auto recordable = context_->GetProcessor().MakeRecordable();

recordable->SetObservedTimestamp(std::chrono::system_clock::now());

if (include_trace_context_ &&
opentelemetry::context::RuntimeContext::GetCurrent().HasKey(opentelemetry::trace::kSpanKey))
{
Expand Down
35 changes: 27 additions & 8 deletions sdk/test/logs/logger_sdk_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#ifdef ENABLE_LOGS_PREVIEW

# include <chrono>
# include <string>

# include "opentelemetry/nostd/string_view.h"
Expand Down Expand Up @@ -43,7 +44,16 @@ class MockLogRecordable final : public opentelemetry::sdk::logs::Recordable
public:
void SetTimestamp(opentelemetry::common::SystemTimestamp) noexcept override {}

void SetObservedTimestamp(opentelemetry::common::SystemTimestamp) noexcept override {}
void SetObservedTimestamp(
opentelemetry::common::SystemTimestamp observed_timestamp) noexcept override
{
observed_timestamp_ = observed_timestamp;
}

const opentelemetry::common::SystemTimestamp &GetObservedTimestamp() const noexcept
{
return observed_timestamp_;
}

opentelemetry::logs::Severity GetSeverity() const noexcept { return severity_; }

Expand Down Expand Up @@ -121,13 +131,14 @@ class MockLogRecordable final : public opentelemetry::sdk::logs::Recordable

void CopyFrom(const MockLogRecordable &other)
{
severity_ = other.severity_;
body_ = other.body_;
trace_id_ = other.trace_id_;
span_id_ = other.span_id_;
trace_flags_ = other.trace_flags_;
event_name_ = other.event_name_;
event_domain_ = other.event_domain_;
severity_ = other.severity_;
body_ = other.body_;
trace_id_ = other.trace_id_;
span_id_ = other.span_id_;
trace_flags_ = other.trace_flags_;
event_name_ = other.event_name_;
event_domain_ = other.event_domain_;
observed_timestamp_ = other.observed_timestamp_;
}

private:
Expand All @@ -138,6 +149,8 @@ class MockLogRecordable final : public opentelemetry::sdk::logs::Recordable
opentelemetry::trace::TraceFlags trace_flags_;
std::string event_name_;
std::string event_domain_;
opentelemetry::common::SystemTimestamp observed_timestamp_ =
std::chrono::system_clock::from_time_t(0);
};

class MockProcessor final : public LogRecordProcessor
Expand Down Expand Up @@ -196,6 +209,8 @@ TEST(LoggerSDK, LogToAProcessor)
}
opentelemetry::trace::Scope trace_scope{include_span};

auto now = std::chrono::system_clock::now();

auto sdk_logger = static_cast<opentelemetry::sdk::logs::Logger *>(logger.get());
ASSERT_EQ(sdk_logger->GetInstrumentationScope().GetName(), "opentelelemtry_library");
ASSERT_EQ(sdk_logger->GetInstrumentationScope().GetVersion(), "");
Expand Down Expand Up @@ -226,6 +241,10 @@ TEST(LoggerSDK, LogToAProcessor)
std::string span_id_text_in_span{span_id_in_span, sizeof(span_id_in_span)};
ASSERT_EQ(trace_id_text_in_logger, trace_id_text_in_span);
ASSERT_EQ(span_id_text_in_logger, span_id_text_in_span);

ASSERT_GE(
static_cast<std::chrono::system_clock::time_point>(shared_recordable->GetObservedTimestamp()),
now);
}

TEST(LoggerSDK, EventLog)
Expand Down

0 comments on commit 7f5b8e0

Please sign in to comment.