iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Kubernetes上如何使用Jaeger分布式追踪
  • 170
分享到

Kubernetes上如何使用Jaeger分布式追踪

2023-07-05 09:07:42 170人浏览 安东尼
摘要

今天小编给大家分享一下kubernetes上如何使用Jaeger分布式追踪的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。正文

今天小编给大家分享一下kubernetes上如何使用Jaeger分布式追踪的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    正文

    作为分布式系统(或任何系统)的一个组成部分,监测基础设施的重要性怎么强调都不过分。监控不仅要跟踪二进制的 "上升 "和 "下降 "模式,还要参与到复杂的系统行为中。监测基础设施的设置可以让人们深入了解性能、系统健康和长期的行为模式。

    微服务架构中的可观察性

    Kubernetes已经成为微服务基础设施和部署的事实上的协调器。这个生态系统非常丰富,是开源社区中发展最快的系统之一。带有prometheuselasticsearch、Grafana、Envoy/Consul、Jaeger/Zipkin的监控基础设施构成了一个坚实的基础,以实现整个堆栈的指标、日志、仪表盘、服务发现和分布式跟踪。

    分布式追踪

    分布式跟踪能够捕获请求,并建立一个从用户请求到数百个服务之间互动的整个调用链的视图。它还能对应用程序的延迟(每个请求花了多长时间)进行检测,跟踪网络调用的生命周期(Httprpc等),并通过获得瓶颈的可见性来确定性能问题。

    下面的章节将介绍在Kubernetes设置中使用Jaeger对grpc服务进行分布式跟踪。Jaeger GitHub Org有专门的Repo,用于Kubernetes中Jaeger的各种部署配置。这些都是很好的例子,我将尝试分解每个Jaeger组件和它的Kubernetes部署。

    Jaeger组件

    Jaeger是一个开源的分布式跟踪系统,实现了OpenTracing规范。Jaeger包括存储、可视化和过滤跟踪的组件。

    架构图

    Kubernetes上如何使用Jaeger分布式追踪

    Jaeger客户端

    应用程序跟踪仪表从Jaeger客户端开始。下面的例子使用Jaeger Go库从环境变量初始化追 踪 器配置,并启用客户端指标。

    package tracerimport (    "io"    "github.com/uber/jaeger-client-go/config"    jprom "github.com/uber/jaeger-lib/metrics/prometheus")func NewTracer() (opentracing.Tracer, io.Closer, error) {    // load config from environment variables    cfg, _ := jaegercfg.FromEnv()// 博客原来:janrs.com    // create tracer from config    return cfg.NewTracer(        config.Metrics(jprom.New()),    )}

    Go客户端使通过环境变量初始化Jaeger配置变得简单。一些需要设置的重要环境变量包括JAEGER_SERVICE_NAME、JAEGER_AGENT_HOST和JAEGER_AGENT_PORT。Jaeger Go客户端支持的环境变量的完整列表列在这里。

    为了给你的gRPC微服务添加追踪功能,我们将使用gRPC中间件来启用gRPC服务器和客户端的追踪功能。 grpc-ecosystem/go-grpc-middleware有一个很棒的拦截器集合,包括支持OpenTracing提供者的服务器端和客户端的拦截器。

    grpc_opentracing包暴露了opentracing拦截器,可以用任何opentracing.Tracer实现来初始化。在这里,我们用连的单项和流拦截器初始化了一个gRPC服务器。启用它将创建一个根serverSpan,对于每个服务器端的gRPC请求,追 踪 器将为服务中定义的每个RPC调用附加一个Span。

    package grpc_serverimport ("github.com/opentracing/opentracing-go""github.com/grpc-ecosystem/go-grpc-middleware/tracing/opentracing""github.com/grpc-ecosystem/go-grpc-middleware""google.golang.org/grpc"  "github.com/masroorhasan/myapp/tracer")func NewServer() (*grpc.Server, error) { // initialize tracertracer, closer, err := tracer.NewTracer()defer closer.Close()if err != nil {return &grpc.Server{}, err}opentracing.SetGlobalTracer(tracer)// initialize grpc server with chained interceptors # janrs.coms := grpc.NewServer(grpc.StreamInterceptor(grpc_middleware.ChainStreamServer(// add opentracing stream interceptor to chaingrpc_opentracing.StreamServerInterceptor(grpc_opentracing.WithTracer(tracer)),  )),  grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(// add opentracing unary interceptor to chaingrpc_opentracing.UnaryServerInterceptor(grpc_opentracing.WithTracer(tracer)),)),)return s, nil}

    为了实现对gRPC服务的上游和下游请求的追踪,gRPC客户端也必须用客户端开放追踪拦截器进行初始化,如下例所示。

    package grpc_clientimport (    "github.com/opentracing/opentracing-go"    "github.com/grpc-ecosystem/go-grpc-middleware/tracing/opentracing"    "github.com/grpc-ecosystem/go-grpc-middleware"    "google.golang.org/grpc"    "github.com/masroorhasan/myapp/tracer")func NewClientConn(address string) (*grpc.ClientConn, error) {    // initialize tracer #博文来源:janrs.com    tracer, closer, err := tracer.NewTracer()    defer closer.Close()    if err != nil {        return &grpc.ClientConn{}, err    }    // initialize client with tracing interceptor [#博文来源:janrs.com#] using grpc client side chaining    return grpc.Dial(        address,        grpc.WithStreamInterceptor(grpc_middleware.ChainStreamClient(            grpc_opentracing.StreamClientInterceptor(grpc_opentracing.WithTracer(tracer)),        )),        grpc.WithUnaryInterceptor(grpc_middleware.ChainUnaryClient(            grpc_opentracing.UnaryClientInterceptor(grpc_opentracing.WithTracer(tracer)),        )),     )}

    由gRPC中间件创建的父跨度被注入到go上下文中,从而实现强大的跟踪支持。opentracing go客户端可以用来将子跨度附加到父跨度上,以实现更精细的追踪,以及控制每个跨度的寿命,为追踪添加自定义标签等。

    Jaeger代理

    Jaeger代理是一个守护进程,它通过UDP接收来自Jaeger客户端的跨度,并将它们分批转发给收集器。该代理作为一个缓冲器,从客户那里抽象出批处理和路由。

    尽管代理是作为一个守护程序建立的,但在Kubernetes设置中,代理可以被配置为在应用Pod中作为一个sidecar容器运行,或作为一个独立的DaemonSet。

    下文讨论了每种部署策略的优点和缺点。

    Jaeger SideCar 代理

    Jaeger Sidecar 代理是一个容器,与你的应用容器放在同一个舱中。表示为Jaeger服务的应用程序myapp将通过localhost向代理发送Jaeger跨度到6381端口。[#博文来源:janrs.com#]如前所述,这些配置是通过客户端的环境变量JAEGER_SERVICE_NAME、JAEGER_AGENT_HOST和JAEGER_AGENT_PORT设置的。

    apiVersion: apps/v1kind: Deploymentmetadata:  name: myapp-deployment  namespace: default  labels:    app: myappspec:  replicas: 3  selector:    matchLabels:      app: myapp  template:    metadata:      labels:        app: myapp    spec:      containers:      - name: myapp        image: masroorhasan/myapp        ports:        - containerPort: 80        env:        - name: JAEGER_SERVICE_NAME          value: myapp        - name: JAEGER_AGENT_HOST          value: localhost  # default        - name: JAEGER_AGENT_PORT          value: "6831"        resources:          limits:            memory: 500M            cpu: 250m          requests:            memory: 500M            cpu: 250m      # sidecar agent      - name: jaeger-agent        image: jaegertracing/jaeger-agent:1.6.0        ports:        - containerPort: 5775          protocol: UDP        - containerPort: 5778          protocol: tcp        - containerPort: 6831          protocol: UDP        - containerPort: 6832          protocol: UDP        command:          - "/go/bin/agent-linux"          - "--collector.host-port=jaeger-collector.monitoring:14267"        resources:          limits:            memory: 50M            cpu: 100m          requests:            memory: 50M            cpu: 100m

    通过这种方法,每个代理(也就是每个应用)都可以被配置为向不同的收集器(也就是不同的后端存储)发送痕迹。

    然而,这种方法最大的缺点之一是将代理的生命周期和应用程序紧密结合在一起。追踪的目的是在应用程序的生命周期内提供对其的洞察力。更有可能的是,代理侧车容器在主应用容器之前被杀死,在应用服务关闭期间,任何/所有重要的追踪都会丢失。这些痕迹的丢失对于理解复杂服务交互的应用生命周期行为可能是非常重要的。这个GitHub问题验证了在关机期间正确处理SIGTERM的必要性。

    Jaeger Daemonset 代理

    另一种方法是通过Kubernetes中的DaemonSet工作负载,将代理作为集群中每个节点的守护程序运行。DaemonSet工作负载可以确保当节点被扩展时,DaemonSet Pod的副本也随之扩展。

    在这种情况下,每个代理守护程序负责从其节点中安排的所有运行中的应用程序(配置了Jaeger客户端)中获取追踪信息。这是通过在客户端设置JAEGER_AGENT_HOST指向节点中代理的IP来配置的。代理DaemonSet被配置为hostNetwork: true和适当的DNS策略,以便Pod使用与主机相同的IP。由于代理的6831端口是通过UDP接受jaeger.thrift消息的,所以守护的Pod配置端口也与hostPort: 6831绑定。

    # Auth : janrs.comapiVersion: apps/v1kind: Deploymentmetadata:  name: myapp-deployment  namespace: default  labels:    app: myappspec:  replicas: 3  selector:    matchLabels:      app: myapp  template:    metadata:      labels:        app: myapp    spec:      containers:      - name: myapp        image: masroorhasan/myapp        ports:        - containerPort: 80        env:        - name: JAEGER_SERVICE_NAME          value: myapp        - name: JAEGER_AGENT_HOST   # NOTE: Point to the Agent daemon on the node          valueFrom:            fieldRef:              fieldPath: status.hostIP        - name: JAEGER_AGENT_PORT          value: "6831"        resources:          limits:            memory: 500M            cpu: 250m          requests:            memory: 500M            cpu: 250m---apiVersion: extensions/v1beta1kind: DaemonSetmetadata:  name: jaeger-agent  namespace: monitoring  labels:    app: jaeger    jaeger-infra: agent-daemonsetspec:  template:    metadata:      labels:        app: jaeger        jaeger-infra: agent-instance    spec:      hostNetwork: true     # NOTE: Agent is configured to have same IP as the host/node      dnsPolicy: ClusterFirstWithHostNet      containers:      - name: agent-instance        image: jaegertracing/jaeger-agent:1.6.0        command:          - "/go/bin/agent-linux"          - "--collector.host-port=jaeger-collector.monitoring:14267"          - "--processor.jaeger-binary.server-queue-size=2000"          - "--discovery.conn-check-timeout=500ms"        ports:        - containerPort: 5775          protocol: UDP        - containerPort: 6831          protocol: UDP          hostPort: 6831        - containerPort: 6832          protocol: UDP        - containerPort: 5778          protocol: TCP        resources:          requests:            memory: 200M            cpu: 200m          limits:            memory: 200M            cpu: 200m

    人们可能会被诱 惑(就像我一样),用Kubernetes服务来引导DaemonSet。这背后的想法是,不要把应用程序的痕迹绑定到当前节点的单一代理上。使用服务可以将工作负载(跨度)分散到集群中的所有代理。这在理论上减少了在受影响节点的单个代理荚发生故障的情况下,应用实例丢失跨度的机会。

    然而,当你的应用程序扩展时,这将不起作用,高负载会在需要处理的痕迹数量上产生巨大的峰值。使用Kubernetes服务意味着通过网络从客户端向代理发送追踪信息。很快,我就开始注意到大量的掉线现象。客户端通过UDP thrift协议向代理发送跨度,大量的峰值导致超过UDP最大数据包大小,从而导致丢包。

    解决办法是适当地分配资源,使Kubernetes在整个集群中更均匀地调度pod。[#博文来源:janrs.com#]我们可以增加客户端的队列大小(设置JAEGER_REPORTER_MAX_QUEUE_SIZE环境变量),以便在代理失效时有足够的缓冲空间。增加代理的内部队列大小也是有益的(设置处理器.jaeger-binary.server-queue-size值),这样他们就不太可能开始丢弃跨度。

    Jaeger Collector 服务

    Jaeger收集器负责从Jaeger代理那里接收成批的跨度,通过处理管道运行它们,并将它们存储在指定的存储后端。跨度以jaeger.thrift格式从Jaeger代理处通过TChannel(TCP)协议发送,端口为14267。

    Jaeger收集器是无状态的,可以根据需要扩展到任何数量的实例。因此,收集器可以由Kubernetes内部服务(ClusterIP)前置,可以从代理到不同收集器实例的内部流量进行负载平衡。

    apiVersion: extensions/v1beta1kind: Deploymentmetadata:  name: jaeger-collector  namespace: monitoring  labels:    app: jaeger    jaeger-infra: collector-deploymentspec:  replicas: 1  strategy:    type: Recreate  template:    metadata:      labels:        app: jaeger        jaeger-infra: collector-pod    spec:      containers:      - image: jaegertracing/jaeger-collector:1.6.0        name: jaeger-collector        args: ["--config-file=/conf/collector.yaml"]        ports:        - containerPort: 14267          protocol: TCP        - containerPort: 14268          protocol: TCP        - containerPort: 9411          protocol: TCP        readinessProbe:          httpGet:            path: "/"            port: 14269        volumeMounts:        - name: jaeger-configuration-volume          mountPath: /conf        env:        - name: SPAN_STORAGE_TYPE          valueFrom:            configMapKeyRef:              name: jaeger-configuration              key: span-storage-type      volumes:        - configMap:            name: jaeger-configuration            items:              - key: collector                path: collector.yaml          name: jaeger-configuration-volume      resources:        requests:          memory: 300M          cpu: 250m        limits:          memory: 300M          cpu: 250m---apiVersion: v1kind: Servicemetadata:  name: jaeger-collector  namespace: monitoring  labels:    app: jaeger    jaeger-infra: collector-servicespec:  ports:  - name: jaeger-collector-tchannel    port: 14267    protocol: TCP    targetPort: 14267  selector:    jaeger-infra: collector-pod  type: ClusterIPview raw

    Jaeger Query 查询服务

    查询服务是支持用户界面的Jaeger服务器。它负责从存储器中检索痕迹,并将其格式化以显示在用户界面上。根据查询服务的使用情况,它的资源占用率非常小。

    设置一个内部Jaeger用户界面的入口,指向后端查询服务。

    apiVersion: extensions/v1beta1kind: Deploymentmetadata:  name: jaeger-query  namespace: monitoring  labels:    app: jaeger    jaeger-infra: query-deploymentspec:  replicas: 1  strategy:    type: Recreate  template:    metadata:      labels:        app: jaeger        jaeger-infra: query-pod    spec:      containers:      - image: jaegertracing/jaeger-query:1.6.0        name: jaeger-query        args: ["--config-file=/conf/query.yaml"]        ports:        - containerPort: 16686          protocol: TCP        readinessProbe:          httpGet:            path: "/"            port: 16687        volumeMounts:        - name: jaeger-configuration-volume          mountPath: /conf        env:        - name: SPAN_STORAGE_TYPE          valueFrom:            configMapKeyRef:              name: jaeger-configuration              key: span-storage-type        resources:          requests:            memory: 100M            cpu: 100m          limits:            memory: 100M            cpu: 100m      volumes:        - configMap:            name: jaeger-configuration            items:              - key: query                path: query.yaml          name: jaeger-configuration-volume---apiVersion: v1kind: Servicemetadata:  name: jaeger-query  namespace: monitoring  labels:    app: jaeger    jaeger-infra: query-servicespec:  ports:  - name: jaeger-query    port: 16686    targetPort: 16686  selector:    jaeger-infra: query-pod  type: ClusterIP---apiVersion: extensions/v1beta1kind: IngreSSMetadata: name: jaeger-ui namespace: monitoring annotations:   kubernetes.io/ingress.class: traefik # or Nginx or whatever ingress controllerspec: rules: - host: jaeger.internal-host # your jaeger internal endpoint   http:     paths:     - backend:         serviceName: jaeger-query         servicePort: 16686

    Storage Configuration 存储配置

    Jaeger同时支持ElasticSearch和Cassandra作为存储后端。使用ElasticSearch作为存储,可以拥有一个强大的监控基础设施,将跟踪和日志记录联系在一起。采集器处理管道的一部分是为其存储后端索引跟踪--这将使跟踪显示在你的日志UI(例如Kibana)中,也将跟踪ID与你的结构化日志标签绑定。你可以通过SPAN_STORAGE_TYPE的环境变量将存储类型设置为ElasticSearch,并通过配置配置存储端点。

    Kubernetes ConfigMap用于设置一些Jaeger组件的存储配置。例如,Jaeger收集器和查询服务的存储后端类型和端点。

    apiVersion: v1kind: ConfigMapmetadata:  name: jaeger-configuration  namespace: monitoring  labels:    app: jaeger    jaeger-infra: configurationdata:  span-storage-type: elasticsearch  collector: |    es:      server-urls: http://elasticsearch:9200    collector:      zipkin:        http-port: 9411  query: |    es:      server-urls: http://elasticsearch:9200

    监控

    如前所述,追踪是监控基础设施的一个重要组成部分。这意味着,甚至你的追踪基础设施的组件也需要被监控。

    Jaeger在每个组件的特定端口上以Prometheus格式暴露指标。如果有正在运行的Prometheus节点导出器(它绝对应该是)在特定的端口上刮取指标 - 然后将你的Jaeger组件的指标端口映射到节点导出器正在刮取指标的端口。

    这可以通过更新Jaeger服务(代理、收集器、查询)来完成,将它们的指标端口(5778、14628或16686)映射到节点出口商期望搜刮指标的端口(例如8888/8080)。

    一些需要跟踪的重要指标。

    Health of each component — memory usage: sum(rate(container_memory_usage_bytes{container_name=~”^jaeger-.+”}[1m])) by (pod_name)

    Health of each component — CPU usage: sum(rate(container_cpu_usage_seconds_total{container_name=~"^jaeger-.+"}[1m])) by (pod_name)

    Batch failures by Jaeger Agent: sum(rate(jaeger_agent_tc_reporter_jaeger_batches_failures[1m])) by (pod)

    Spans dropped by Collector: sum(rate(jaeger_collector_spans_dropped[1m])) by (pod)

    Queue latency (p95) of Collector: histogram_quantile(0.95, sum(rate(jaeger_collector_in_queue_latency_bucket[1m])) by (le, pod))

    这些指标为了解每个组件的性能提供了重要的见解,历史数据应被用来进行最佳设置。

    以上就是“Kubernetes上如何使用Jaeger分布式追踪”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

    --结束END--

    本文标题: Kubernetes上如何使用Jaeger分布式追踪

    本文链接: https://www.lsjlt.com/news/350711.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Kubernetes上如何使用Jaeger分布式追踪
      今天小编给大家分享一下Kubernetes上如何使用Jaeger分布式追踪的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。正文...
      99+
      2023-07-05
    • Kubernetes上使用Jaeger分布式追踪基础设施详解
      目录正文微服务架构中的可观察性分布式追踪Jaeger组件架构图Jaeger客户端Jaeger代理Jaeger SideCar 代理Jaeger Daemonset 代理Jaeger ...
      99+
      2023-03-06
      Kubernetes Jaeger分布式追踪 Kubernetes Jaeger
    • 如何使用分布式链路追踪
      这篇文章主要介绍“如何使用分布式链路追踪”,在日常操作中,相信很多人在如何使用分布式链路追踪问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用分布式链路追踪”的疑惑有所帮...
      99+
      2024-04-02
    • 如何让你的Nginx支持分布式追踪详解
      目录Background源码构建nginx-opentracing准备nginx-opentracing准备jaeger-client-cpp编译gcc编译cmake编译jaeger...
      99+
      2024-04-02
    • 如何使用Python实现分布式系统中的二维码追踪功能?
      分布式系统中的二维码追踪功能是一个非常有用的功能,它可以让我们追踪二维码的使用情况,以便更好地管理和优化我们的业务。在本文中,我们将介绍如何使用Python实现分布式系统中的二维码追踪功能。 一、了解二维码追踪功能的原理 在分布式系统中,我...
      99+
      2023-10-02
      关键字 二维码 分布式
    • skywalking分布式服务调用链路追踪APM应用监控
      目录前言skywalking是什么,有什么用?skywalaking总体架构分为三部分如何快速开始?第一步:进入官方release地址第二步:配置需要监控的应用的agent探针系统使...
      99+
      2024-04-02
    • 分布式系统下调用链追踪技术面试题
      目录引言1、面试官:分布式微服务环境下那么多机器,调用链又很长,你们是如何定位问题的?2、面试官:你知道哪些成熟的调用链开源工具? 总结引言 一个复杂的分布式系统,用户发起...
      99+
      2024-04-02
    • Java gRPC拦截器如何实现分布式日志链路追踪器
      这篇文章主要介绍“Java gRPC拦截器如何实现分布式日志链路追踪器”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java gRPC拦截器如何实现分布式日志链路追踪器”文章能帮...
      99+
      2023-07-05
    • Sleuth 与 Zipkin:分布式追踪,揭开应用黑盒中的奥秘
      分布式追踪的必要性 随着微服务架构和复杂分布式系统的普及,追踪跨组件和服务间的请求和响应流变得至关重要。分布式追踪可视化应用程序执行流程,揭示性能瓶颈、依赖关系和异常。 Sleuth:Spring Boot 的追踪利器 Sleuth 是...
      99+
      2024-03-07
      分布式追踪、Sleuth、Zipkin、微服务、应用程序性能管理
    • 分布式微服务系统下调用链追踪技术实例分析
      这篇文章主要介绍“分布式微服务系统下调用链追踪技术实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“分布式微服务系统下调用链追踪技术实例分析”文章能帮助大家解决问题。1、面试官:分布式微服务环境...
      99+
      2023-06-29
    • skywalking分布式服务调用链路追踪APM应用监控的示例分析
      这篇文章给大家分享的是有关skywalking分布式服务调用链路追踪APM应用监控的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言当企业应用进入分布式微服务时代,应用服务依赖会越来越多,skywalk...
      99+
      2023-06-29
    • Golang技术如何支持分布式系统中的分布式跟踪?
      go语言中的分布式跟踪至关重要,它允许开发人员跟踪请求在分布式系统中的流动,以便进行故障排除和性能优化。go语言提供了opentracing库,它是一个平台无关的api,允许应用程序与跟...
      99+
      2024-05-07
      分布式系统 分布式跟踪 git golang go语言
    • linux中如何使用strace追踪mysql执行语句
      这篇文章将为大家详细讲解有关linux中如何使用strace追踪mysql执行语句,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。strace是Linux环境下的一款程序调...
      99+
      2024-04-02
    • 如何避免使用免费代理ip被追踪
      这篇文章主要介绍“如何避免使用免费代理ip被追踪”,在日常操作中,相信很多人在如何避免使用免费代理ip被追踪问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何避免使用免费代理ip被追踪”的疑惑有所帮助!接下来...
      99+
      2023-06-25
    • 如何用 SensioLabsInsight 调试 PHP 函数的分布式跟踪?
      sensiolabsinsight 可用于调试 php 函数的分布式跟踪。首先安装并配置 sensiolabsinsight,然后通过在函数声明上添加 @traced() 注释来启用分布...
      99+
      2024-04-23
      php 分布式跟踪 composer
    • 如何使用 Git 追踪日志中的二维码?
      在日常的软件开发中,Git 是一个非常常用的版本控制系统。它可以帮助我们追踪代码的变化,方便地进行协作开发。但是,如果你的项目中包含了二维码,如何才能在 Git 中追踪它们的变化呢?本文将为您介绍如何使用 Git 追踪日志中的二维码。 一...
      99+
      2023-10-06
      二维码 日志 git
    • 如何使用分布式锁
      本篇内容主要讲解“如何使用分布式锁”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用分布式锁”吧!什么是分布式锁分布式锁又可以解决哪些问题呢在我们的系统还没...
      99+
      2024-04-02
    • 如何使用分布式Quorum NWR
      这篇文章主要介绍“如何使用分布式Quorum NWR”,在日常操作中,相信很多人在如何使用分布式Quorum NWR问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用分布...
      99+
      2024-04-02
    • kubernetes中如何实现分布式负载测试Locust
      这篇文章主要介绍了kubernetes中如何实现分布式负载测试Locust,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一: 前言  本文介绍如何在Kubernet...
      99+
      2023-06-04
    • 如何使用 Git 追踪特定文件的更改历史?
      Git 是一款开源的分布式版本控制系统,它可以追踪代码的更改历史。除了可以追踪整个代码仓库的更改历史,Git 还可以追踪特定文件的更改历史。在本文中,我们将讨论如何使用 Git 追踪特定文件的更改历史。 Git 的基本概念 在了解如何使用 ...
      99+
      2023-10-07
      数组 git 日志
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作