
测试#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_sharedopencensus::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_sizemeasure: name: my.org/measure/video_size; units: By; description: size of processed videos; type: int64aggregation: Distribution with Buckets: 0,1.67772e07,2.68435e08aggregation window: Cumulativecolumns: my.org/keys/frontenddescription: processed video size over timeexpiry duration: 0Waiting 10.1s for exporters to run...Name: my.org/ProcessVideoTraceId-SpanId-Options: 8ad59ba5bb062620a8b1b82d330e4447-f815861ab2819a74-01Parent SpanId: 0000000000000000 (remote: false)Start time: 2024-08-28T06:18:33.286604700:00End time: 2024-08-28T06:18:33.30560100:00Attributes: (0 dropped)Annotations: (0 dropped)2024-08-28T06:18:33.286653600:00: Start processing video.2024-08-28T06:18:33.305593800:00: Finished processing video.Message events: (0 dropped)Links: (0 dropped)Span ended: trueStatus: 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.296348200:00 to 2024-08-28T06:18:43.29642396900:00:my.org/keys/frontendvideo sizecount: 1 mean: 2.62144e07 sum of squared deviation: 0 min: 2.62144e07 max: 2.62144e07histogram counts: 0, 0, 1, 0View data:video size : count: 1 mean: 2.62144e07 sum of squared deviation: 0 min: 2.62144e07 max: 2.62144e07histogram counts: 0, 0, 1, 0参考C tracy性能分析-CSDN博客gprof性能分析_gprof分析-CSDN博客C性能调优工具_c调优工具-CSDN博客C性能调优-CSDN博客GitHub - census-instrumentation/opencensus-cpp: A stats collection and distributed tracing frameworkhttps://github.com/prometheus/prometheushttps://github.com/jupp0r/prometheus-cppOverview | Prometheus创作不易小小的支持一下吧