测试
#include <time.h>
#include <cstdlib>
#include <iostream>
#include <memory>
#include <string>
#include "absl/strings/string_view.h"
#include "absl/time/clock.h"
#include "absl/time/time.h"
// #include "opencensus/exporters/stats/prometheus/prometheus_exporter.h"
#include "opencensus/exporters/stats/stdout/stdout_exporter.h"
#include "opencensus/exporters/trace/stdout/stdout_exporter.h"
#include "opencensus/stats/stats.h"
#include "opencensus/trace/sampler.h"
#include "opencensus/trace/span.h"
#include <iostream>
#include "absl/strings/string_view.h"
#include "absl/time/clock.h"
// #include "opencensus/exporters/stats/prometheus/prometheus_exporter.h"
#include "opencensus/stats/stats.h"
#include "opencensus/tags/tag_key.h"
//#include "prometheus/exposer.h"
namespace {
ABSL_CONST_INIT const absl::string_view kVideoSizeViewName =
"my.org/views/video_size";
ABSL_CONST_INIT const absl::string_view kVideoSizeMeasureName =
"my.org/measure/video_size";
// The resource owner defines and registers a measure. A function exposing a
// function-local static is the recommended style, ensuring that the measure is
// only registered once.
opencensus::stats::MeasureInt64 VideoSizeMeasure() {
static const opencensus::stats::MeasureInt64 video_size =
opencensus::stats::MeasureInt64::Register(
kVideoSizeMeasureName, "size of processed videos", "By");
return video_size;
}
opencensus::tags::TagKey FrontendKey() {
static const auto frontend_key =
opencensus::tags::TagKey::Register("my.org/keys/frontend");
return frontend_key;
}
} // namespace
constexpr int64_t kMiB = 1 << 20;
ABSL_CONST_INIT const absl::string_view kLatencyMeasureName = "repl/latency";
ABSL_CONST_INIT const absl::string_view kLineLengthsMeasureName = "repl/line_lengths";
// Treat Measures and TagKeys as singletons and initialize on
// demand in order to avoid initialization order issues.
opencensus::stats::MeasureDouble LatencyMsMeasure() {
static const auto measure = opencensus::stats::MeasureDouble::Register(
kLatencyMeasureName, "The latency in milliseconds", "ms");
return measure;
}
opencensus::stats::MeasureInt64 LineLengthsMeasure() {
static const auto measure = opencensus::stats::MeasureInt64::Register(
kLineLengthsMeasureName, "The distributions of line lengths", "By");
return measure;
}
opencensus::tags::TagKey MethodKey() {
static const auto key = opencensus::tags::TagKey::Register("method");
return key;
}
opencensus::stats::ViewDescriptor RegisterViews() {
// 1. Latency view
// We need to register the measure before registering the view.
LatencyMsMeasure();
opencensus::stats::ViewDescriptor()
.set_name("ocquickstart.io/latency")
.set_description("The various methods' latencies in milliseconds")
.set_measure(kLatencyMeasureName)
.set_aggregation(opencensus::stats::Aggregation::Distribution(
opencensus::stats::BucketBoundaries::Explicit(
{0, 25, 50, 75, 100, 200, 400, 600, 800, 1000, 2000, 4000,
6000})))
.add_column(MethodKey())
.RegisterForExport();
// 2. Line lengths
LineLengthsMeasure();
opencensus::stats::ViewDescriptor()
.set_name("ocquickstart.io/line_lengths")
.set_description("The length of the lines read in")
.set_measure(kLineLengthsMeasureName)
.set_aggregation(opencensus::stats::Aggregation::Distribution(
opencensus::stats::BucketBoundaries::Explicit(
{0, 5, 10, 15, 20, 40, 60, 80, 100, 200, 400, 600, 800,
1000})))
.add_column(MethodKey())
.RegisterForExport();
// 3. Lines count: just a count aggregation on the line lengths measure
opencensus::stats::ViewDescriptor()
.set_name("ocquickstart.io/lines_in")
.set_description("The number of lines read in")
.set_measure(kLineLengthsMeasureName)
.set_aggregation(opencensus::stats::Aggregation::Count())
.add_column(MethodKey())
.RegisterForExport();
// Register stdout exporters.
opencensus::exporters::stats::StdoutExporter::Register();
opencensus::exporters::trace::StdoutExporter::Register();
// Call measure so that it is initialized.
VideoSizeMeasure();
// Create view to see the processed video size distribution broken down by
// frontend. The view has bucket boundaries (0, 16 * kMiB, 65536 * kMiB) that
// will group measure values into histogram buckets.
const opencensus::stats::ViewDescriptor video_size_view =
opencensus::stats::ViewDescriptor()
.set_name(kVideoSizeViewName)
.set_description("processed video size over time")
.set_measure(kVideoSizeMeasureName)
.set_aggregation(opencensus::stats::Aggregation::Distribution(
opencensus::stats::BucketBoundaries::Explicit(
{0, 16 * kMiB, 256 * kMiB})))
.add_column(FrontendKey());
return video_size_view;
}
std::string getLine() {
absl::Time start = absl::Now();
std::string input;
// Get the line
std::getline(std::cin, input);
absl::Time end = absl::Now();
double latency_ms = absl::ToDoubleMilliseconds(end - start);
// Record both measures at once.
opencensus::stats::Record({{LatencyMsMeasure(), latency_ms},
{LineLengthsMeasure(), input.length()}},
{{MethodKey(), "getLine"}});
return input;
}
std::string processLine(const std::string& in) {
absl::Time start = absl::Now();
std::string out(in);
for (auto it = out.begin(); it != out.end(); it++) {
*it = std::toupper(*it);
}
absl::Time end = absl::Now();
double latency_ms = absl::ToDoubleMilliseconds(end - start);
opencensus::stats::Record({{LatencyMsMeasure(), latency_ms}},
{{MethodKey(), "processLine"}});
return out;
}
// Simple program that collects data for video size.
int main(int argc, char **argv) {
if (argc != 1) {
std::cerr << "Usage: " << argv[0] << "\n";
return 1;
}
srand(time(NULL));
// // Firstly enable the Prometheus exporter
// auto exporter =
// std::make_shared<opencensus::exporters::stats::PrometheusExporter>();
// // Expose Prometheus on :8888
// prometheus::Exposer exposer("127.0.0.1:8888");
// exposer.RegisterCollectable(exporter);
auto video_size_view = RegisterViews(); // trace
opencensus::stats::View view(video_size_view);
video_size_view.RegisterForExport();
// Samplers are potentially expensive to construct. Use one long-lived sampler
// instead of constructing one per Span.
static opencensus::trace::AlwaysSampler sampler;
// Done initializing. Video processing starts here:
auto span = opencensus::trace::Span::StartSpan("my.org/ProcessVideo", nullptr,
{&sampler});
span.AddAnnotation("Start processing video.");
// Sleep for [1,10] milliseconds to fake work.
absl::SleepFor(absl::Milliseconds(rand() % 10 + 1));
// Record the processed video size.
opencensus::stats::Record({{VideoSizeMeasure(), 25 * kMiB}},
{{FrontendKey(), "video size"}});
span.AddAnnotation("Finished processing video.");
span.End();
std::cout << "video_size_view definitions:" << video_size_view.DebugString()
<< "\n\n";
std::cout << "Waiting 10.1s for exporters to run...\n\n";
absl::SleepFor(absl::Milliseconds(10100));
std::cout << "View data:\n";
const auto data = view.GetData();
assert(data.type() == opencensus::stats::ViewData::Type::kDistribution);
for (auto &it : data.distribution_data()) {
std::cout << " ";
for (auto &name : it.first) std::cout << name << " : ";
std::cout << it.second.DebugString() << "\n";
}
}
输出
video_size_view definitions:
name: "my.org/views/video_size"
measure: name: "my.org/measure/video_size"; units: "By"; description: "size of processed videos"; type: int64
aggregation: Distribution with Buckets: 0,1.67772e+07,2.68435e+08
aggregation window: Cumulative
columns: my.org/keys/frontend
description: "processed video size over time"
expiry duration: 0Waiting 10.1s for exporters to run...
Name: my.org/ProcessVideo
TraceId-SpanId-Options: 8ad59ba5bb062620a8b1b82d330e4447-f815861ab2819a74-01
Parent SpanId: 0000000000000000 (remote: false)
Start time: 2024-08-28T06:18:33.2866047+00:00
End time: 2024-08-28T06:18:33.305601+00:00
Attributes: (0 dropped)
Annotations: (0 dropped)
2024-08-28T06:18:33.2866536+00:00: Start processing video.
2024-08-28T06:18:33.3055938+00:00: Finished processing video.
Message events: (0 dropped)
Links: (0 dropped)
Span ended: true
Status: OKNo data for view "ocquickstart.io/latency".
No data for view "ocquickstart.io/line_lengths".
No data for view "ocquickstart.io/lines_in".
Data for view "my.org/views/video_size":
Row data from 2024-08-28T06:18:38.2963482+00:00 to 2024-08-28T06:18:43.296423969+00:00:
my.org/keys/frontend=video size
count: 1 mean: 2.62144e+07 sum of squared deviation: 0 min: 2.62144e+07 max: 2.62144e+07
histogram counts: 0, 0, 1, 0View data:
video size : count: 1 mean: 2.62144e+07 sum of squared deviation: 0 min: 2.62144e+07 max: 2.62144e+07
histogram counts: 0, 0, 1, 0
参考
GitHub - census-instrumentation/opencensus-cpp: A stats collection and distributed tracing framework
https://github.com/prometheus/prometheus
https://github.com/jupp0r/prometheus-cpp