我正在尝试将OpenTracing.Contrib.NetCore与Serilog 一起使用。我需要将自定义日志发送给Jaeger。现在,它仅在我使用默认记录器工厂时才有效Microsoft.Extensions.Logging.ILoggerFactory
我的创业公司:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSingleton<ITracer>(sp =>
{
var loggerFactory = sp.GetRequiredService<ILoggerFactory>();
string serviceName = sp.GetRequiredService<IHostingEnvironment>().ApplicationName;
var samplerConfiguration = new Configuration.SamplerConfiguration(loggerFactory)
.WithType(ConstSampler.Type)
.WithParam(1);
var senderConfiguration = new Configuration.SenderConfiguration(loggerFactory)
.WithAgentHost("localhost")
.WithAgentPort(6831);
var reporterConfiguration = new Configuration.ReporterConfiguration(loggerFactory)
.WithLogSpans(true)
.WithSender(senderConfiguration);
var tracer = (Tracer)new Configuration(serviceName, loggerFactory)
.WithSampler(samplerConfiguration)
.WithReporter(reporterConfiguration)
.GetTracer();
//GlobalTracer.Register(tracer);
return tracer;
});
services.AddOpenTracing();
}
Run Code Online (Sandbox Code Playgroud)
在控制器中的某个位置:
[Route("api/[controller]")]
public class ValuesController : ControllerBase
{
private readonly ILogger<ValuesController> _logger;
public ValuesController(ILogger<ValuesController> logger)
{
_logger = logger;
}
[HttpGet("{id}")] …Run Code Online (Sandbox Code Playgroud) 有没有办法配置 opentracing-spring-jaeger-cloud-starter 来处理除 Uber-Trace-Id 之外的任何其他标头?我的 kubernetes 集群中有 Traefik 作为入口。Traefik 可以配置为更改 traceContextHeaderName。默认值为“uber-trace-id”。当我将其更改为某种自定义时,服务之间没有连接(我的意思是跨度连接)。我相信 opentracing 仅适用于 Uber-Trace-Id。有没有办法配置它?
我在 minikube 中使用 Traefik 作为入口进行测试。然后所有请求都转到 spring-cloud-gateway 并传播到服务。
感谢帮助!
我正在使用 OpenTracing,并且正在尝试通过 RabbitMQ 传播跨度。但是我不明白我应该如何注入跨度以及如何在以后提取它。
这是发送消息的代码
def send_message(self, message, tracer):
root_span = tracer.get_span()
with opentracing.tracer.start_span('Sending message to broker', child_of=root_span) as span:
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='default')
json_message = json.dumps(message)
channel.basic_publish(exchange='',
routing_key='default',
body=json_message)
connection.close()`
Run Code Online (Sandbox Code Playgroud)
我有一个用于接收消息的回调函数
def _callback(self, ch, method, properties, body):
print(" [x] Received %r" % body)
Run Code Online (Sandbox Code Playgroud)
所以在某个地方,我想以某种方式注入跨度,然后提取它。有没有人知道或有任何关于如何做的例子?
我曾尝试在像这样在发件人中调用 basic_publish 之前注入
tracer.inject(span, Format.HTTP_HEADERS, headers)
Run Code Online (Sandbox Code Playgroud)
但我不知道哪些参数将进入注入方法。
然后我尝试在回调中像这样提取它
span_ctx = tracer.extract(Format.HTTP_HEADERS, {})
Run Code Online (Sandbox Code Playgroud)
同样,我不知道哪些参数会进入提取方法。
编辑:解决了,有点
我通过将载体发送到属性标题来解决它。然后我可以从回调属性属性中提取跨度
在发件人中:
channel.basic_publish(exchange='',
routing_key='default',
properties=pika.BasicProperties(headers=carrier),
body=json_message)
Run Code Online (Sandbox Code Playgroud)
在回调中,提取跨度:
def _callback(self, ch, method, properties, body):
span_ctx = tracer.extract(Format.TEXT_MAP, properties.headers)
Run Code Online (Sandbox Code Playgroud) 我尝试执行此docker命令以使用Elasticsearch设置Jaeger Agent和Jaeger Collector。
sudo docker run \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-e SPAN_STORAGE_TYPE=elasticsearch \
--name=jaeger \
jaegertracing/all-in-one:latest
Run Code Online (Sandbox Code Playgroud)
但是此命令给出以下错误。如何用ElasticSearch配置Jaeger?
"msg":"Failed to init storage factory","error":"health check timeout: no Elasticsearch node available","errorVerbose":"no Elasticsearch node available\
Run Code Online (Sandbox Code Playgroud) 我们在 Istio 中使用 Opentracing/Jaeger 来跟踪多个基于 Spring Boot/Spring Cloud 的微服务。
我目前想知道是否有一个选项可以通过提供有关已执行查询(即 SQL 语句)的信息来丰富跟踪范围?使用opentracing-contrib/java-spring-cloud跟踪 JDBC 连接信息工作正常,但缺少附加信息。
我知道,例如,glowroot能够跟踪语句本身,但没有找到与 Opentracing 或 Jaeger 相关的任何内容。
如果有人可以展示一些研究方向,那就太好了!
所以我正在探索Jaeger for Tracing,我发现我们可以直接通过HTTP(端口:14268)将span从客户端发送到收集器,如果是这样那么使用jaeger代理有什么优势。
何时采用 Jaeger Agent 方法以及何时采用直接 HTTP 方法。使用直接方法收集器有什么缺点
我们将跟踪信息注入到基于 urllib3 实现的 API 客户端库中所有 http 请求调用的请求标头中
def _init_jaeger_tracer():
'''Jaeger tracer initialization'''
config = Config(
config={
'sampler': {
'type': 'const',
'param': 1,
},
},
service_name="session"
)
return config.new_tracer()
class APIObject(rest.APIObject):
'''Class for injecting traces into urllib3 request headers'''
def __init__(self, configuration):
print("RESTClientObject child class called####")
self._tracer = None
super().__init__(configuration)
self._tracer = _init_jaeger_tracer()
# pylint: disable=W0221
def request(self, method, url, *args, **kwargs):
lower_method = method.lower()
with self._tracer.start_active_span('requests.{}'.format(lower_method)) as scope:
span = scope.span
span.set_tag(tags.SPAN_KIND, tags.SPAN_KIND_RPC_CLIENT)
span.set_tag(tags.COMPONENT, 'request')
span.set_tag(tags.HTTP_METHOD, lower_method)
span.set_tag(tags.HTTP_URL, url)
headers …Run Code Online (Sandbox Code Playgroud) 我在看 APM 工具。本质上是 Dynatrace,我可以看到它还提供了似乎与语言无关且无需修改代码的跟踪功能。
与 dynatrace 之类的工具相比,jaeger/open tracking 在哪里会是更好的选择?
是的,dynatrace(或其他类似 Elastic APM)能够提供对跟踪以外的应用程序的更多洞察。
但仅从跟踪的角度来看...... jaeger 有哪些优势或能力比 APM 工具更好或在 APM 中不可用。仅从跟踪的角度来看。
我正在寻找开放跟踪实现以将应用程序跟踪到 JaegerUI。我们的应用程序前端是 angular,后端是 Asp.net Web api。
我能够使用 Jaeger C# nuget 包跟踪 webapi。但是,我还没有找到一种方法/ npm 包来跟踪到 Jaeger 的角度跟踪消息。
我知道有一个用于 node.js(server) 的 Jaeger npm 包,但没有用于在浏览器中运行的客户端 javascript/typescript。
您能否让我知道我们如何在前端(Javascript/angular)使用 Jaeger 实现 opentracing,以便我们可以在 Jaeger 中看到完整的跨度跟踪(前端到后端)
我是 Jaeger 的新手,我想使用它来记录我的微服务的跟踪。
\n我从 \xce\xbcservices 创建跟踪,提供traceId它们作为消息发布并在另一个服务中使用它们,以便将跟踪导出到 Jaeger。\n虽然我还没有找到一种方法来提供跨度 ID 并从生产方。
我是否应该在消费者中保存某种状态,例如(每个跟踪的父范围),以便我可以拥有正确的层次结构?你会怎么做呢?
\n我当前的设置的顺序是由首先完成的设置设置的,而不是由首先开始的设置设置的,这是所期望的。API 应该是第一个。你知道我该如何解决这个问题吗?
\n任何想法或反馈都将受到高度赞赏。
\nopentracing ×10
jaeger ×9
spring-cloud ×2
angular ×1
apm ×1
asp.net-core ×1
c# ×1
deployment ×1
devops ×1
docker ×1
dynatrace ×1
go ×1
inject ×1
java ×1
javascript ×1
python ×1
rabbitmq ×1
serilog ×1
spring-boot ×1
traefik ×1
urllib3 ×1