偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

React 前端應(yīng)用中快速實(shí)踐 OpenTelemetry 云原生可觀(guān)測(cè)性(SigNoz/K8S)

開(kāi)發(fā) 前端
SigNoz 作為后端分析與可視化工具。雖相對(duì)于 ELK Stack 還有很多不足,但它號(hào)稱(chēng)是基于 OpenTelemetry 生態(tài)原生構(gòu)建的下一代開(kāi)源可觀(guān)測(cè)平臺(tái),期待它后續(xù)發(fā)展。

圖片

OpenTelemetry 可用于跟蹤 React 應(yīng)用程序的性能問(wèn)題和錯(cuò)誤。您可以跟蹤從前端 web 應(yīng)用程序到下游服務(wù)的用戶(hù)請(qǐng)求。OpenTelemetry 是云原生計(jì)算基金會(huì)(CNCF)下的一個(gè)開(kāi)源項(xiàng)目,旨在標(biāo)準(zhǔn)化遙測(cè)數(shù)據(jù)的生成和收集。已成為下一代可觀(guān)測(cè)平臺(tái)的事實(shí)標(biāo)準(zhǔn)。

React(也稱(chēng)為 React.js 或 ReactJS )是一個(gè)免費(fèi)的開(kāi)源前端 JavaScript 庫(kù),用于基于 UI 組件構(gòu)建用戶(hù)界面。它是由 Meta (以前的 Facebook)和一個(gè)由個(gè)人開(kāi)發(fā)者和公司組成的社區(qū)維護(hù)的。React 可以作為使用 Next.js 等框架開(kāi)發(fā)單頁(yè)、移動(dòng)或服務(wù)器渲染應(yīng)用程序的基礎(chǔ)。

然而,React 只關(guān)心狀態(tài)管理和將狀態(tài)呈現(xiàn)給 DOM,因此創(chuàng)建 React 應(yīng)用程序通常需要使用額外的庫(kù)進(jìn)行路由,以及某些客戶(hù)端功能。

使用 opentelemetry-js 庫(kù),你可以讓你的 React 應(yīng)用生成跟蹤數(shù)據(jù)。您可以跟蹤從前端 web 應(yīng)用程序到下游服務(wù)的用戶(hù)請(qǐng)求。

在演示如何實(shí)現(xiàn) OpenTelemetry 庫(kù)之前,讓我們簡(jiǎn)要概述一下 OpenTelmetry。

什么是 OpenTelemetry?

OpenTelemetry 是一套與第三方廠(chǎng)商無(wú)關(guān)的開(kāi)源工具、API 和 SDK,用于檢測(cè)應(yīng)用程序,以創(chuàng)建和管理遙測(cè)數(shù)據(jù)(日志、指標(biāo)和跟蹤)。

圖片圖片

OpenTelemetry 庫(kù)的 instrument(采集程序) 應(yīng)用程序代碼生成遙測(cè)數(shù)據(jù),然后發(fā)送到可觀(guān)察性工具進(jìn)行存儲(chǔ)和可視化

OpenTelemetry 是建立可觀(guān)測(cè)性框架的基礎(chǔ)。它還為您提供了選擇后端分析工具的自由。

OpenTelemetry 與 SigNoz

在本文中,我們將使用 SigNoz 作為后端分析工具。SigNoz 是一個(gè)全棧開(kāi)源 APM 工具,可用于存儲(chǔ)和可視化 OpenTelemetry 收集的遙測(cè)數(shù)據(jù)。它是在 OpenTelemetry 上原生構(gòu)建的,并適用于 OTLP 數(shù)據(jù)格式。

SigNoz 為最終用戶(hù)提供了查詢(xún)和可視化功能,并附帶了用于應(yīng)用程序度量和跟蹤的開(kāi)箱即用圖表。

現(xiàn)在,讓我們開(kāi)始了解如何使用 opentelemetry-js 庫(kù),然后在 SigNoz 中可視化收集的數(shù)據(jù)。

快速實(shí)踐實(shí)驗(yàn)環(huán)境

DigitalOcean 托管集群(k8s v1.24.13)。

Helm 一鍵安裝 SigNoz

helm repo add signoz https://charts.signoz.io

helm install signoz signoz/signoz -n apm --create-namespace \
--set otelCollector.config.receivers.otlp.protocols.http.include_metadata=true \
--set otelCollector.config.receivers.otlp.protocols.http.cors.allowed_origins='https://apm-demo.react-admin.com'

注意:cors 跨域設(shè)置,我這里 React 應(yīng)用域名是 https://apm-demo.react-admin.com

查看 Pod

kubectl get po -n apm

NAME                                               READY   STATUS    RESTARTS       AGE
chi-signoz-clickhouse-cluster-0-0-0                1/1     Running   0              3m51s
signoz-alertmanager-0                              1/1     Running   0              4m5s
signoz-clickhouse-operator-54b6d79f58-b47ff        2/2     Running   2 (4m2s ago)   4m5s
signoz-frontend-564b8c4868-88grm                   1/1     Running   0              4m5s
signoz-k8s-infra-otel-agent-dqh5c                  1/1     Running   0              4m6s
signoz-k8s-infra-otel-agent-jdvnh                  1/1     Running   0              4m6s
signoz-k8s-infra-otel-agent-tb8sp                  1/1     Running   0              4m6s
signoz-k8s-infra-otel-deployment-dc85b496f-n6dhm   1/1     Running   0              4m5s
signoz-otel-collector-655cff46d8-7z5wn             1/1     Running   0              4m5s
signoz-otel-collector-metrics-7775fc9857-mb8wv     1/1     Running   0              4m5s
signoz-query-service-0                             1/1     Running   0              4m5s
signoz-zookeeper-0                                 1/1     Running   0              4m5s

暴露采集器 Server

此集群 Ingress Controller 是 Traefik,配置如下:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: ingest
  namespace: apm
spec:
  entryPoints:
    - web
  routes:
    - match: PathPrefix(`/`) && Host(`ingest.doge-data.com`)
      kind: Rule
      services:
        - name: signoz-otel-collector
          port: 4318

示例應(yīng)用

測(cè)試地址:

https://apm-demo.react-admin.com

倉(cāng)庫(kù):

https://github.com/SigNoz/sample-reactjs-app.git

OpenTelemetry-JS

倉(cāng)庫(kù):

https://github.com/open-telemetry/opentelemetry-js

官方文檔:

https://opentelemetry.io/docs/instrumentation/js/

Tracing 示例核心源碼

位于示例倉(cāng)庫(kù):src/helpers/tracing/index.ts

import { context, trace, Span, SpanStatusCode } from "@opentelemetry/api";
import { WebTracerProvider } from "@opentelemetry/sdk-trace-web";
import { Resource } from "@opentelemetry/resources";
import { SimpleSpanProcessor } from "@opentelemetry/sdk-trace-base";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
import { ZoneContextManager } from "@opentelemetry/context-zone";
import { FetchInstrumentation } from "@opentelemetry/instrumentation-fetch";
import { FetchError } from "@opentelemetry/instrumentation-fetch/build/src/types";
import { registerInstrumentations } from "@opentelemetry/instrumentation";

const serviceName = "link-frontend";

const resource = new Resource({ "service.name": serviceName });
const provider = new WebTracerProvider({ resource });

const collector = new OTLPTraceExporter({
  url: "https://ingest.doge-data.com/v1/traces",
  // headers: {
  //   "signoz-access-token": "SigNoz-Cloud-Ingestion-Token-HERE"
  // }
});

provider.addSpanProcessor(new SimpleSpanProcessor(collector));
provider.register({ contextManager: new ZoneContextManager() });

const webTracerWithZone = provider.getTracer(serviceName);

declare const window: any;
var bindingSpan: Span | undefined;

window.startBindingSpan = (
  traceId: string,
  spanId: string,
  traceFlags: number
) => {
  bindingSpan = webTracerWithZone.startSpan("");
  bindingSpan.spanContext().traceId = traceId;
  bindingSpan.spanContext().spanId = spanId;
  bindingSpan.spanContext().traceFlags = traceFlags;
};

registerInstrumentations({
  instrumentations: [
    new FetchInstrumentation({
      propagateTraceHeaderCorsUrls: ["/.*/g"],
      clearTimingResources: true,
      applyCustomAttributesOnSpan: (
        span: Span,
        request: Request | RequestInit,
        result: Response | FetchError
      ) => {
        const attributes = (span as any).attributes;
        if (attributes.component === "fetch") {
          span.updateName(
            `${attributes["http.method"]} ${attributes["http.url"]}`
          );
        }
        if (result instanceof Error) {
          span.setStatus({
            code: SpanStatusCode.ERROR,
            message: result.message,
          });
          span.recordException(result.stack || result.name);
        }
      },
    }),
  ],
});

export function traceSpan<F extends (...args: any) => ReturnType<F>>(
  name: string,
  func: F
): ReturnType<F> {
  var singleSpan: Span;
  if (bindingSpan) {
    const ctx = trace.setSpan(context.active(), bindingSpan);
    singleSpan = webTracerWithZone.startSpan(name, undefined, ctx);
    bindingSpan = undefined;
  } else {
    singleSpan = webTracerWithZone.startSpan(name);
  }
  return context.with(trace.setSpan(context.active(), singleSpan), () => {
    try {
      const result = func();
      singleSpan.end();
      return result;
    } catch (error) {
      singleSpan.setStatus({ code: SpanStatusCode.ERROR });
      singleSpan.end();
      throw error;
    }
  });
}

在 React 組件中使用

位于示例倉(cāng)庫(kù):src/components/TracingButton/index.tsx

import { Button } from '@mui/material'

import { traceSpan } from 'helpers/tracing'

interface Props {
  label: string;
  id?: string;
  secondary?: boolean;
  onClick: () => void;
}

export default (props: Props) => {
  const onClick = (): void =>
    traceSpan(`'${props.label}' button clicked`, props.onClick);

  return (
    <div>
      <Button
        id={props.id}
        variant={"contained"}
        color={props.secondary ? "secondary" : "primary"}
        notallow={onClick}
      >
        {props.label}
      </Button>
    </div>
  );
};

測(cè)試 React 應(yīng)用上報(bào)

轉(zhuǎn)到 https://apm-demo.react-admin.com , 單擊 FETCH LINKS。

圖片圖片

SigNoz 后臺(tái)面板查看,聚合指標(biāo)等

圖片圖片

圖片圖片

圖片圖片

總結(jié)

本篇文章側(cè)重于快速實(shí)踐,OpenTelemetry 本身很復(fù)雜,涉及很多基礎(chǔ)概念,大家自行翻閱文檔。

https://opentelemetry.io/docs/

SigNoz 作為后端分析與可視化工具。雖相對(duì)于 ELK Stack 還有很多不足,但它號(hào)稱(chēng)是基于 OpenTelemetry 生態(tài)原生構(gòu)建的下一代開(kāi)源可觀(guān)測(cè)平臺(tái),期待它后續(xù)發(fā)展。

有興趣的朋友,也可以二次開(kāi)發(fā) SigNoz,增加自身項(xiàng)目需求。

責(zé)任編輯:武曉燕 來(lái)源: 黑客下午茶
相關(guān)推薦

2023-10-26 08:47:30

云原生數(shù)據(jù)采集

2021-05-04 18:28:23

Apache KafkSigNoz開(kāi)源

2023-09-06 07:51:19

KubernetesOperator

2023-09-20 16:11:32

云原生分布式系統(tǒng)

2024-05-28 09:37:48

2021-04-29 08:43:17

k8s可觀(guān)測(cè)性Metrics

2023-02-08 17:55:45

SigNoz開(kāi)源工具

2022-05-24 13:47:11

云原生數(shù)據(jù)分辨率

2022-03-24 17:56:51

數(shù)據(jù)平臺(tái)觀(guān)測(cè)

2023-08-07 08:27:43

混合云K8S容器

2022-06-30 10:22:26

K8s可觀(guān)測(cè)Prometheus

2023-11-27 10:18:05

工業(yè)4.0物聯(lián)網(wǎng)

2023-08-07 08:48:13

2023-10-16 23:43:52

云原生可觀(guān)測(cè)性

2025-01-03 08:08:56

2023-09-24 23:35:46

云原生Kubernetes

2021-06-04 06:01:49

Yarn workspTypeScript云原生

2021-11-19 09:40:50

數(shù)據(jù)技術(shù)實(shí)踐

2021-05-24 15:48:38

高德打車(chē)系統(tǒng)可觀(guān)測(cè)性
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)