SigNoz 部署

SigNoz 是一款开源应用程序性能监控工具

架构

SigNoz主要包括4个模块:

  • Otel Collector: 即OpenTelemetry Collector,从服务或容器收集指标数据。针对java,app可以Agent和SDK 2种方式将数据发送给collector,collector负责数据收集、处理和导出到db。当然也可以直接在agent里将数据处理好再持久到db
  • ClickHouse:db存储,需要是时序数据库,这里也可以替换为InfluxDB或Apache Druid等开源时序数据库方案
  • Query Service:官方是Go语言的查询后端服务,也可以DIY成自己的服务
  • Frontend:前端页面,官方是TypeScript和ReactJS写的

github 地址:https://github.com/SigNoz/signoz

部署服务

mkdir -p /data/yaml/platform/signoz

cd /data/yaml/platform/signoz

# 添加源
helm repo add signoz https://charts.signoz.io
helm repo list

# 新增命名空间
kubectl create ns platform

# 根据自身业务要求更改配置
helm pull signoz/signoz
tar zxvf signoz-0.14.3.tgz

cat >> my-values.yaml << EOF
global:
  storageClass: nfs-client

frontend:
  service:
    type: NodePort
EOF

# 启动
helm -n platform install signoz -f my-values.yaml signoz

# 找到 NodePort 地址
export NODE_PORT=$(kubectl get --namespace platform -o jsonpath="{.spec.ports[0].nodePort}" services signoz-frontend)
export NODE_IP=$(kubectl get nodes --namespace platform -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT

接入应用

找到一台vm来打包镜像,当我们访问 http://mydemo1:8080/hello, 会返回 hello world

mkdir -p /data/images/mydemo1
cd /data/images/mydemo1

# 通过下面 url 找到并下载好 opentelemetry-javaagent.jar
https://signoz.io/docs/instrumentation/java/?utm_source=instrumentation_page&utm_medium=frontend&utm_term=language

# 上传自己的小程序 mydemo1-0.0.1-SNAPSHOT.jar 到 /data/images/mydemo1 下
cat >> docker-entrypoint.sh << -'EOF'
#!/bin/bash
java -javaagent:/opentelemetry-javaagent.jar \
    -Dotel.exporter.otlp.endpoint=http://signoz-otel-collector.platform:4317 \
    -Dotel.resource.attributes=service.name=${appName} \
    -jar /${appName}.jar
-EOF

cat >> Dockerfile << -'EOF'
FROM openjdk:17.0.2-slim
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime && echo "Asia/Shanghai" >/etc/timezone
ADD opentelemetry-javaagent.jar opentelemetry-javaagent.jar
ADD mydemo1-0.0.1-SNAPSHOT.jar mydemo1.jar
COPY docker-entrypoint.sh /
CMD [ "/bin/bash", "/docker-entrypoint.sh" ]
-EOF

# 查看该目录下的内容
[root@test mydemo1]# ls
docker-entrypoint.sh  Dockerfile  mydemo1-0.0.1-SNAPSHOT.jar  opentelemetry-javaagent.jar

# 构建并上传镜像
docker build -t mydemo1:0.2 .
docker tag mydemo1:0.2 devharbor.junengcloud.com/tmp/mydemo1:0.2
docker push devharbor.junengcloud.com/tmp/mydemo1:0.2

## 在K8S中部署测试
mkdir -p /data/yaml/default/mydemo1 && cd /data/yaml/default/mydemo1

cat >> deployment.yaml << -'EOF' 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mydemo1
  namespace: default 
  labels:
    app: mydemo1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mydemo1
  template:
    metadata:
      labels:
        app: mydemo1
    spec:
      containers:
      - name: mydemo1
        image: devharbor.junengcloud.com/tmp/mydemo1:0.2
        imagePullPolicy: IfNotPresent
        env:
        - name: appName
          valueFrom:
            fieldRef:
              fieldPath: metadata.labels['app']
        resources:
          limits:
            cpu: 1000m
            memory: 1Gi
          requests:
            cpu: 50m
            memory: 10Mi
        volumeMounts: 
        - name: time-data
          mountPath: /etc/localtime
          readOnly: false 
      volumes: 
      - name: time-data 
        hostPath: 
          path: /usr/share/zoneinfo/Asia/Shanghai
-EOF

kubectl apply -f deployment.yaml

# 找到并访问容器,生成监控数据
[root@k8s-master-1 mydemo1]# kubectl get pod -o wide|grep mydemo1
mydemo1-77b4b9b5dc-stpht                        1/1     Running   0              146m   10.144.0.95     k8s-master-1   <none>           <none>
[root@k8s-master-1 mydemo1]# curl 10.144.0.95:8080/hello
hello world![root@k8s-master-1 mydemo1]# curl 10.144.0.95:8080/hello
hello world![root@k8s-master-1 mydemo1]# curl 10.144.0.95:8080/hello
hello world![root@k8s-master-1 mydemo1]# curl 10.144.0.95:8080/hello
hello world![root@k8s-master-1 mydemo1]# curl 10.144.0.95:8080/hello
hello world![root@k8s-master-1 mydemo1]# 

posted @ 2023-05-06 18:32  klvchen  阅读(1158)  评论(0)    收藏  举报