C++ opentracing zipkin
Useful page : https://github.com/openzipkin/b3-propagation & other official websites
Steps to run attached scripts
- Download opentracing: https://github.com/opentracing/opentracing-cpp
- Download and install OpenTracing implementation for Zipkin : https://github.com/rnburn/zipkin-cpp-opentracing
- Download ZipKin backend server :curl -sSL https://zipkin.io/quickstart.sh | bash -s
- Run opentracingtest/build.sh
- Start zipkin backend: java -jar zipkin.jar
- Start ./server
- Start ./client
- Go to http://localhsot:9411
// text_map_carrier.h, copy from example folder
#ifndef LIGHTSTEP_TEXT_MAP_CARRIER
#define LIGHTSTEP_TEXT_MAP_CARRIER #include <opentracing/propagation.h>
#include <string>
#include <unordered_map> using opentracing::TextMapReader;
using opentracing::TextMapWriter;
using opentracing::expected;
using opentracing::string_view; // class textMapCarrier
class TextMapCarrier : public TextMapReader, public TextMapWriter {
public:
TextMapCarrier(std::unordered_map<std::string, std::string> &text_map)
: text_map_(text_map) {} expected<void> Set(string_view key, string_view value) const override {
text_map_[key] = value;
return {};
} expected<void> ForeachKey(
std::function<expected<void>(string_view key, string_view value)> f)
const override {
for (const auto &key_value : text_map_) {
auto result = f(key_value.first, key_value.second);
if (!result)
return result;
}
return {};
} std::unordered_map<std::string, std::string> &text_map_;
}; // span context reader/writer helper std::string read_span_context(std::unordered_map<std::string, std::string> m)
{
std::string output = ""; for (auto it = m.cbegin(); it != m.cend(); it++)
{
output += (it->first) + ":" + it->second + ",";
} return output.substr(, output.size() - );
} void write_span_context(std::unordered_map<std::string, std::string> &m, char *context)
{
char * keypair = strtok(context, ",");
while(keypair != NULL)
{
std::string s(keypair);
std::string::size_type found = s.find_first_of(':');
m.insert(std::pair<std::string, std::string>(s.substr(,found),s.substr(found+)));
keypair =strtok(NULL, ",");
}
} #endif // LIGHTSTEP_TEXT_MAP_CARRIER
// client.cpp, copy from example folder
#include "text_map_carrier.h"
#include <unistd.h>
#include <sys/types.h> /* basic system data types */
#include <sys/socket.h> /* basic socket definitions */
#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */
#include <netdb.h> /* gethostbyname function */
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <string.h> #include <cassert>
#include <iostream>
#include <unordered_map>
#include <zipkin/opentracing.h>
using namespace zipkin;
using namespace opentracing; #define MAXLINE 1024 int main()
{
int socket_fd;
char buf[MAXLINE];
char buf2[MAXLINE];
struct sockaddr_in serv_addr ; socket_fd = socket(PF_INET, SOCK_STREAM, );
bzero( &serv_addr, sizeof(serv_addr) );
serv_addr.sin_family = AF_INET ;
serv_addr.sin_port = htons();
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr); ZipkinOtTracerOptions options;
options.service_name = "client_app";
auto tracer = makeZipkinOtTracer(options);
assert(tracer); auto parent_span = tracer->StartSpan("startMain"); {
auto child_span =
tracer->StartSpan("Step1", {ChildOf(&parent_span->context())});
assert(child_span); // Set a simple tag.
child_span->SetTag("simple tag", ); // Set a complex tag.
child_span->SetTag("complex tag",
Values{, Dictionary{{"abc", }, {"xyz", 4.0}}}); // Log simple values.
child_span->Log({{"event", "simple log"}, {"abc", }}); // Log complex values.
child_span->Log({{"event", "complex log"},
{"data", Dictionary{{"a", }, {"b", Values{, }}}}}); sleep();
child_span->Finish();
} // Create a follows from span.
{
auto child_span =
tracer->StartSpan("Step1_1", {FollowsFrom(&parent_span->context())});
sleep(); // child_span's destructor will finish the span if not done so explicitly.
} // Use custom timestamps.
{
auto t1 = SystemClock::now();
sleep();
auto t2 = SteadyClock::now();
auto span = tracer->StartSpan(
"Step3",
{ChildOf(&parent_span->context()), StartTimestamp(t1)});
assert(span);
span->Finish({FinishTimestamp(t2)});
} if(connect(socket_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == )
{
printf("client starts ...\n"); while()
{
static int n = ; if( n>=) break; char span_name[];
sprintf(span_name, "request_%d", n++); auto child_span = tracer->StartSpan(span_name, {ChildOf(&parent_span->context())});
std::unordered_map<std::string, std::string> text_map;
TextMapCarrier carrier(text_map);
auto err = tracer->Inject(child_span->context(), carrier);
std::string contxt = read_span_context(text_map); // for testing
if(n == ) sleep(); printf("send message : %d\n", n);
sprintf(buf, "%s\r\n%d",contxt.c_str(), n);
if(write(socket_fd, buf, MAXLINE) == -)
printf("write error\n"); sleep(); // wait for response
while(read(socket_fd, buf2, MAXLINE) == -) { sleep();}
printf("get message from server: %s\n", buf2);
child_span->Finish();
}
} parent_span->Finish();
tracer->Close();
return ;
}
// server.cpp
#include "text_map_carrier.h"
#include <unistd.h>
#include <sys/types.h> /* basic system data types */
#include <sys/socket.h> /* basic socket definitions */
#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */
#include <netdb.h> /* gethostbyname function */
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <string.h> #include <cassert>
#include <iostream>
#include <unordered_map>
#include <zipkin/opentracing.h>
using namespace zipkin;
using namespace opentracing; #define MAXLINE 1024
#define LISTENQ 1024 int main(int argc, char **argv)
{
int listen_fd, connect_fd;
char buf[MAXLINE];
char buf2[MAXLINE];
socklen_t len;
struct sockaddr_in serv_addr, client_addr; ZipkinOtTracerOptions options;
options.service_name = "server_app";
auto tracer = makeZipkinOtTracer(options); listen_fd = socket(PF_INET, SOCK_STREAM, );
bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons();
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) ;
bind(listen_fd, (struct sockaddr*)&serv_addr, sizeof(struct sockaddr_in)); printf("start listening ..\n");
listen(listen_fd, LISTENQ);
for( ; ; )
{
connect_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &len);
if(connect_fd < ) continue; printf("accept from %s : %d \n", inet_ntoa(client_addr.sin_addr), client_addr.sin_port);
while()
{
if (read(connect_fd, buf, MAXLINE) > -)
{
char contxt[MAXLINE];
int data;
sscanf(buf,"%s\r\n%d",contxt,&data);
std::unordered_map<std::string, std::string> text_map;
write_span_context(std::ref(text_map),&contxt[]);
TextMapCarrier carrier(text_map);
auto span_context_maybe = tracer->Extract(carrier); if(!span_context_maybe)
printf("error context............\n"); auto span = tracer->StartSpan("receive", {ChildOf(span_context_maybe->get())});
printf("receive message : %d\n", data); // for testing
if (data == ) sleep(); sprintf(buf2, "back %d", data);
sleep();
if(write(connect_fd, buf2, MAXLINE) == -)
printf("write error");
span->Finish();
}
sleep();
}
close(connect_fd);
sleep();
} tracer->Close();
}
# build.sh
g++ -g -O0 client.cpp -o client -lcurl -lopentracing -lzipkin -lzipkin_opentracing -pthread -std=c++
g++ -g -O0 server.cpp -o server -lcurl -lopentracing -lzipkin -lzipkin_opentracing -pthread -std=c++
C++ opentracing zipkin的更多相关文章
- 带入gRPC:分布式链路追踪 gRPC + Opentracing + Zipkin
在实际应用中,你做了那么多 Server 端,写了 N 个 RPC 方法.想看看方法的指标,却无处下手? 本文将通过 gRPC + Opentracing + Zipkin 搭建一个分布式链路追踪系统 ...
- 【Springboot】实例讲解Springboot整合OpenTracing分布式链路追踪系统(Jaeger和Zipkin)
1 分布式追踪系统 随着大量公司把单体应用重构为微服务,对于运维人员的责任就更加重大了.架构更复杂.应用更多,要从中快速诊断出问题.找到性能瓶颈,并不是一件容易的事.因此,也随着诞生了一系列面向Dev ...
- python 微服务方案
介绍 使用python做web开发面临的一个最大的问题就是性能,在解决C10K问题上显的有点吃力.有些异步框架Tornado.Twisted.Gevent 等就是为了解决性能问题.这些框架在性能上有些 ...
- Spring Cloud 微服务分布式链路跟踪 Sleuth 与 Zipkin
Zipkin 是一个开放源代码分布式的跟踪系统,由 Twitter 公司开源,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集.存储.查找和展现.它的理论模型来自于Google ...
- OpenTracing:开放式分布式追踪规范
前言 想实现一个简单的追踪系统似乎是容易的,需要必要的调用链id,时间戳等:想实现一款易用不侵入代码的追踪系统就很麻烦了,需要接触CLR和IL相关知识:即使你费劲心力做出了那些,如果性能不够好,也没有 ...
- Laravel + go-micro + grpc 实践基于 Zipkin 的分布式链路追踪系统 摘自https://mp.weixin.qq.com/s/JkLMNabnYbod-b4syMB3Hw?
分布式调用链跟踪系统,属于监控系统的一类.系统架构逐步演进时,后期形态往往是一个平台由很多不同的服务.组件构成,用户请求过来后,可能会经过其中多个服务,如图 不过,出问题时往往很难排查,如整个请求变慢 ...
- TarsGo新版本发布,支持protobuf,zipkin和自定义插件
本文作者:陈明杰(sandyskies) Tars是腾讯从2008年到今天一直在使用的后台逻辑层的统一应用框架,目前支持C++,Java,PHP,Nodejs,Golang语言.该框架为用户提供了涉及 ...
- Opentracing + Uber Jaeger 全链路灰度调用链,Nepxion Discovery
当网关和服务在实施全链路分布式灰度发布和路由时候,我们需要一款追踪系统来监控网关和服务走的是哪个灰度组,哪个灰度版本,哪个灰度区域,甚至监控从Http Header头部全程传递的灰度规则和路由策略.这 ...
- 基于Opentracing+Jaeger全链路灰度调用链
当网关和服务在实施全链路分布式灰度发布和路由时候,我们需要一款追踪系统来监控网关和服务走的是哪个灰度组,哪个灰度版本,哪个灰度区域,甚至监控从Http Header头部全程传递的灰度规则和路由策略.这 ...
随机推荐
- MYSQL GTID position
MySQL5.6 新特性之GTID - jyzhou - 博客园 http://www.cnblogs.com/zhoujinyi/p/4717951.html MySQL · 答疑释惑 · GTID ...
- C#技巧记录——持续更新
作为一名非主修C#的程序员,在此记录下学习与工作中C#的有用内容,持续更新 对类型进行约束,class指定了类型必须是引用类型,new()指定了类型必须具有一个无参的构造函数 where T : cl ...
- Tomcat配置实例
转自:https://www.cnblogs.com/kismetv/p/7228274.html 目录 一.一个server.xml配置实例 二.server.xml文档的元素分类和整体结构 1.整 ...
- quotes 整站数据爬取存mongo
安装完成scrapy后爬取部分信息已经不能满足躁动的心了,那么试试http://quotes.toscrape.com/整站数据爬取 第一部分 项目创建 1.进入到存储项目的文件夹,执行指令 scra ...
- ThunderBird配置邮箱后无法发送邮件
今天遇到的问题是在ThunderBird配置邮箱后无法发送邮件.用户名和密码都验证过去了.但一直无法发送邮件. 1.首先imap 和smtp 服务器都是通的. telnet imap.base-fx. ...
- HDU 1757 A Simple Math Problem (矩阵快速幂)
题目 A Simple Math Problem 解析 矩阵快速幂模板题 构造矩阵 \[\begin{bmatrix}a_0&a_1&a_2&a_3&a_4&a ...
- 自动化测试框架【windows版】:JMeter + Ant + Jenkins
前提条件:windows安装了jmeter.ant.jenkins 安装方法参考汇总目录中对应的博文 截图看不清的,可以调大浏览器倍数看 jenkins驱动ant执行,ant驱动jmeter执行 an ...
- http验证
read -p "输入要添加的用户名: " USERNAME read -p "输入密码: " PASSWD printf "$USERNAME:$( ...
- 20165223《网络对抗技术》Exp5 MSF基础应用
目录 -- MSF基础应用 实验说明 实验任务内容 基础问题回答 实验内容 主动攻击 ms17_10_eternalblue(成功) ms17_10_psexec(成功) ms08_067_netap ...
- python学习day15 模块(重点)
模块(重点) python2,与py3的区别 py2:range() 在内存中立即把所有的值都创建,xrange() 不会再内存中立即创建,而是在循环时边环边创建. py3:range() 不会再内存 ...