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]#


浙公网安备 33010602011771号