.Net微服务实战之可观测性

前言

很多次去面试,有经验的面试官都会问一个问题,你是怎么去定位日常遇到的问题?平常跟同行分享自己遇到的问题,事后他会问我,这种看起来毫无头绪的问题,你是怎么去定位解决的?

其实我们平常不知道怎么问题出在哪,主要是所了解的信息量不足,那么怎么才能提高给咱们定位问题的信息量呢?其实上面两个问题的答案都是同一个:日志、指标、跟踪

有日志记录才能清楚知道当前系统的运行状况和具体问题;指标是给与后续做优化和定位偶发性问题的一些参考,没指标参考就没标准;我们平常做得多的调试、查看调用栈也是跟踪的一种,但是在分布式时代,更多考量的是跨进程通信的调用链路。

日志、指标、跟踪三者结合起来有一种统称——可观测性

运维是架构的地基,我第一次看到这句是在张辉清写的《小团队构建大网站:中小研发团队架构实践》,说实话,我非常的认同。不少小团队的运维都是由开发兼职的,而团队的运维能力决定了日后架构选型与日常维护。有良好的运维监控体系,就有足够的信息量提供给开发人员进行定位排错。

可观测性

可观测性的意思是可以由系统的外部输出推断其内部状态的程度,在软件系统中,可观察性是指能够收集有关程序执行、模块内部状态以及组件之间通信的数据。分别由三个方向组成:日志(logging)、跟踪( tracing)、指标(Metrics)《Metrics, tracing, and logging

0c6a2d71d20d2a70d7e7ff48fe1ece9f.png

日志(logging)

日志的定义特征是它记录离散事件,目的是通过这些记录后分析出程序的行为。

例如:应用程序调试或错误消息通过转换文件描述,通过 syslog 发送到 Elasticsearch;审计跟踪事件通过 Kafka 推送到 BigTable 等数据存储;或从服务调用中提取并发送到错误跟踪服务(如 NewRelic)的特定于请求的元数据。

跟踪( tracing)

跟踪的定义特征是它处理请求范围内的信息,目的是排查故障。

在系统中执行的单个事务对象生命周期里,所绑定的数据或元数据。例如:RPC远程服务调用的持续时间;请求到数据库的实际 SQL 查询语句;HTTP 请求入站的关联 ID。

指标(Metrics)

指标的定义特征是它们是可聚合的,目的是监控和预警。

这些指标在一段时间内,能组成单个逻辑仪表、计数器或直方图。例如:队列的当前长度可以被建模为一个量规;HTTP 请求的数量可以建模为一个计数器,更新后通过简单的加法聚合计算;并且可以将观察到的请求持续时间建模为直方图,更新汇总到某个时间段中并建立统计摘要。

代表性产品

日志(logging)基本上是ELK (ElasticSearch, Logstash, Kibana) 技术栈一家独大了,但是Logstash比较重量级的,而轻量级的Filebeat可能更加受大家的青睐。下文里的实战部分,我是以EFK(ElasticSearch, Filebeat, Kibana)演示。

跟踪( tracing)相比于日志就是百花齐放了,Skywalking、zipkin、鹰眼、jeager、Datadog等等……但是在.Net的技术栈里,能提供出SDK的相对会少,所以选择也会少一些,我在之前的实战和下文的演示都是用Skywalking,主要优势无侵入。

指标(Metrics)在云生时代Prometheus比Zabbix更加受大家欢迎,同时Prometheus社区活跃度也占非常大的优势。下文实战部分我以Prometheus 作为演示。

8d477fc9c2d050268bf5686978706582.png

ElasticSearch部署与安装

后面的Skywaking和日志都需要用到ElasticSearch,所以我把部署流程优先提了出来。

导入 GPG key

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

添加源

vim /etc/yum.repos.d/elasticsearch.repo
[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md

重新加载

yum makecache

安装

sudo yum install -y --enablerepo=elasticsearch elasticsearch

修改配置

vim /etc/elasticsearch/elasticsearch.yml
network.host: 0.0.0.0discovery.type: single-node

启动

/sbin/chkconfig --add elasticsearchsudo -i service elasticsearch start
systemctl enable elasticsearch.service

用浏览器访问,能出现下图就是可以了

e867dfd916e37510330fbdd58432d07a.png

Prometheus与Grafana实现指标

架构简析

f716585cce8693fbc31262f8943ec236.png

核心组件

Prometheus server

Prometheus的主程序,本身也是一个时序数据库,它来负责整个监控集群的数据拉取、处理、计算和存储,是使用pull方式由服务端主动拉取监控数据。

Alertmanager

Prometheus的告警组件,负责整个集群的告警发送、分组、调度、警告抑制等功能。 需要知道的是alertmanager本身是不做告警规则计算的,简单来说就是,alertmanager不去计算当前的监控取值是否达到我设定的阈值,上面已经提过该部分规则计算是prometheus server来计算的,alertmanager监听prometheus server发来的消息,然后在结合自己的配置,比如等待周期,重复发送告警时间,路由匹配等配置项,然后把接收到的消息发送到指定的接收者。同时他还支持多种告警接收方式,常见的如邮件、企业微信、钉钉等。1.3

Pushgateway

Pushgateway 它是prometheus的一个中间网管组件,类似于zabbix的zabbix-proxy。它主要解决的问题是一些不支持pull方式获取数据的场景,比如:自定义shell脚本来监控服务的健康状态,这个就没办法直接让prometheus来拉数据,这时就可以借助pushgateway,它是支持推送数据的,我们可以把对应的数据按照prometheus的格式推送到pushgateway,然后配置prometheus server拉取pushgateway即可。

UI 

Grafana、prometheus-ui是用来图形化展示数据的组件,其中prometheus-ui是prometheus项目原生的ui界面,但是在数据展示方面不太好用,因此推荐grafana来展示你的数据,grafana支持prometheus的PromQL语法,能够和prometheus数据库交互,加上grafana强大的ui功能,我们可以很轻松的获取到很多好看的界面,同时也有很多做好的模版可以使用。

Prometheus Target

采集指标的API,有不同的Exporter,如果redis、mysql、server nodel提供给Prometheus server定时pull数据到数据库。

安装Prometheus

mkdir /var/prometheus
docker run -d --name=prometheus -p 9090:9090 prom/prometheus
docker cp prometheus:/etc/prometheus/prometheus.yml /var/prometheus/
删除之前的容器
docker run -d --name=prometheus -p 9090:9090 -v /var/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

到浏览器输入地址访问,出现以下页面则成功

 53cd972c4899baec6915037b3dde9ae5.png

安装Grafana

docker run -d --name=grafana -p 3000:3000 grafana/grafana

安装完成后,使用admin/admin登录

ce1b6a9e8c978ac8b489ff4e198821dd.png

安装Node Exporter

docker run -d -p 9100:9100 \-v "/proc:/host/proc:ro" \-v "/sys:/host/sys:ro" \-v "/:/rootfs:ro" \--net="host" \--restart always \prom/node-exporter

到浏览器输入地址访问(http://192.168.184.129:9100/metrics),出现以下页面则成功

990ffa60282c3e78eb6d6fcd0e82ff5b.png

配置Prometheus

vim /var/prometheus/prometheus.yml

添加以下配置 (注意格式)

  - job_name: service-a

    static_configs:

      - targets: ["192.168.88.138:9100"]

        labels:

          instance: node

  - job_name: service-b

    static_configs:

      - targets: ["192.168.88.146:9100"]

        labels:

          instance: node

  - job_name: service-c

    static_configs:

      - targets: ["192.168.88.144:9100"]

        labels:

          instance: node

重新启动Prometheus,打开浏览器可以见下图

ea072dcd6952b4bdd990b644b950d8dd.png

配置Grafana

添加数据源

474ab9704c12ba287e7b1f068acf94d3.png

导入模板,其他模板可以到 https://grafana.com/grafana/dashboards 查看

9c70d2b7ed8739d6fe8a4dbffb4848d6.png

 确认后则生成(注意修改主机名)

 9ddeb14453399e7ce27db18da6ae31dd.png

到这里完整的一次监控就完成,我们可以根据上诉的步骤添加容器和docker的监控。

使用Docker Exporter监控容器

用docker进行安装

docker run --name docker_exporter --detach --restart always --volume "/var/run/docker.sock":"/var/run/docker.sock" --publish 9417:9417 prometheusnet/docker_exporter

在Prometheus进行配置,添加下面配置项

vim /var/prometheus/prometheus.yml
- job_name: "container"static_configs:- targets: ["192.168.88.138:9417"]

在grafana根据上面node-exporter的步骤进行导入对应的模板 https://grafana.com/grafana/dashboards/11467

7cdb7d202109b9cdd3008148aa084af3.png

使用docker metrics 监控docker

开启metrics

vim  /etc/docker/daemon.json
{"metrics-addr" : "192.168.88.146:9323","experimental" : true
}

重启docker

systemctl daemon-reload
service docker restart

配置Prometheus

- job_name: "docker"static_configs:- targets: ["192.168.88.138:9323", "192.168.88.146:9323", "192.168.88.146:9323"]

导入模板https://grafana.com/grafana/dashboards/1229

c048aaf6d3315a667dbddf792491d8e4.png

SkyWalking实现跟踪

架构简析

f9d87b9a49b3afd2ce8a41171c353986.png

核心组件

Skywalking OAP Server

Skywalking收集器,接受写入请求与UI数据查询。

Skywalking UI

有调用链路记录、网络拓扑图、性能指标展示等。

Skywalking客户端代理

提供了多种语言的SDK(Java, .NET Core, NodeJS, PHP,  Python等),在应用程序进行网络请求的时候进行埋点拦截,整理成需要的指标发送到Skywalking OAP Server,

安装SkyWalking的收集器

docker run --name skywalking-oap-server  -p 12800:12800 -p 11800:11800 -p 1234:1234 --restart always -d -e SW_STORAGE=elasticsearch7 -e SW_STORAGE_ES_CLUSTER_NODES=192.168.184.129:9200 apache/skywalking-oap-server:8.4.0-es7

启动成功后去ES查看,多了很多的Index

dc58e0bf3d414831269963bc0d5b3391.png

安装SkyWalking UI

docker run --name skywalking-ui -p 8888:8080 --restart always -d -e SW_OAP_ADDRESS=192.168.184.129:12800 apache/skywalking-ui:8.4.0

使用时注意调整右下角的时区

d4f28d2a7819d3da8ef86ed3b55d19d8.png

 我们到Github下载源码 https://github.com/SkyAPM/SkyAPM-dotnet,根据how-to-build文档进行编译

- Prepare git and .NET Core SDK.
- `git clone https://github.com/SkyAPM/SkyAPM-dotnet.git`
- `cd SkyAPM-dotnet/`
- Switch to the tag by using `git checkout [tagname]` (Optional, switch if want to build a release from source codes)
- `git submodule init`
- `git submodule update`
- Run `dotnet restore`
- Run `dotnet build src/SkyApm.Transport.Grpc.Protocol`
- Run `dotnet build skyapm-dotnet.sln`

启动SkyApm.Sample.Frontend与SkyApm.Sample.Backend两个项目,浏览器访问http://localhost:5001/api/values/postin ,就可以见到下面的调用链了。

我在19年的时候使用0.9版本,http.request_body和http.response_body都是没记录需要自己扩展,而现在最新版已经有记录,省了不少的事。

11a2a02c2f226d5d4442e98d4c4b228a.png

EFK(ElasticSearch+Filebeat+Kibana)实现日志

安装Nginx

主要用来测试的

添加源

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

安装

yum install -y nginx

修改配置

vim /etc/nginx/nginx.conf

34fd4e5feef8f45fe8d49e02fe259b8d.png

把圈起来的配置改动一下

log_format  json  '{"@timestamp":"$time_iso8601",''"host": "$server_addr",''"clientip": "$remote_addr",''"request_body": "$request_body",''"responsetime": $request_time,''"upstreamtime": "$upstream_response_time",''"upstreamhost": "$upstream_addr",''"http_host": "$host",''"url": "$uri",''"referer": "$http_referer",''"agent": "$http_user_agent",''"status": "$status"}';access_log  /var/log/nginx/access.log  json;

开机启动

systemctl start nginx.service
systemctl enable nginx.service

用浏览器访问,刷新几次,执行cat /var/log/nginx/access.log 就可以看到json格式的日志了

75c624375686372d0f87115306923c2d.png

安装Filebeat

导入安装源

sudo rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
vim /etc/yum.repos.d/elastic.repo

保存下面文案

[elastic-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

执行安装指令

yum install -y filebeat

添加配置

vim /etc/filebeat/filebeat.yml

filebeat.inputs:

  type: log

    enabled: true

    paths:

      /var/log/nginx/access.log

    json.key_under_root: true

    json.overwrite_keys: true

    json.message_key: log

    tags: ["nginx-access"]

  type: log

    enabled: true

    paths:

      /var/log/nginx/error.log

    json.key_under_root: true

    json.overwrite_keys: true

    json.message_key: log

    tags: ["nginx-error"]

filebeat.config.modules:

  path: ${path.config}/modules.d/*.yml

  reload.enabled: false

setup.ilm.enabled: false

setup.template:

  name: "nginx"

  pattern: "nginx-*"

setup.template.overwrite: true

setup.template.enabled: false

output.elasticsearch:

  hosts: ["192.168.184.129:9200"]

  indices:

    - index: "nginx-access-%{+yyyy.MM.dd}"

      when.contains:

        tags: "nginx-access"

    - index: "nginx-error-%{+yyyy.MM.dd}"

      when.contains:

        tags: "nginx-error"

启动

systemctl start filebeat 
systemctl enable filebeat

16ef9fd7b499a2b2ef4973439378f326.png

 安装kibana

docker run --name kibana -d -p 5601:5601 kibana:7.7.0
mkdir /var/kibana
docker cp kibana:/usr/share/kibana/config /var/kibana/config

删除之前的容器再安装一次

docker run --name kibana -d -v /var/kibana/config:/usr/share/kibana/config -p 5601:5601 kibana:7.7.0

修改配置后,重启容器

vim /var/kibana/config/kibana.yml

287fd9e6bb54fe2b99bc344b797e05ce.png

 打开浏览器访问

7c5f5a223bb3d818a8ed3d4f8fbdf6ef.png

创建索引,填写nginx-access-*

1ba2857b3c18ed61a7edf319f5762293.png

4e9a38e3665d85669cac4e580f24aebc.png

最后的展示UI

a313da91d5dfe86847825f96e6fdbaba.png

.Net的日志同样可以使用Json保存,然后通过Filebeat进行采集。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“财务自由的15个阶段!说说你到哪个阶段了?”

1 穷人家的狗子早当家2 看剧的时候忘记理我家猫它就变成这样了... 3 仿佛看到了自己周末&放假的日常。4 一颗爆米花的诞生5 说说你的财务到哪个阶段了?6 三个字,证明你是哪里人?不准出现地名你点的每个赞,我都认真当…

LiveJournal发展历程

因近期打算对公司应用架构进行调整, 其中的一些思路值得借鉴. 以下为转载内容: 一、LiveJournal发展历程 LiveJournal是99年始于校园中的项目,几个人出于爱好做了这样一个应用,以实现以下功能: 博客,论坛社会性网络,找…

前端快闪三:多环境灵活配置react

大前端快闪:package.json文件知多少?大前端快闪二:react开发模式 一键启动多个服务你已经使用Create React App[1] 脚手架搭建了React应用,现在该部署了。一般会使用npm run build或者yarn build构建出静态资源, 由web…

vSphere 4系列之六:Standard vSwitch

一、ESX网络基础 我们知道在物理环境中,主机是通过物理Switch连入到网络环境中的,与此类似,在vSphere虚拟环境中有vSwitch,虚拟机就是通过ESX主机上vSwitch来连入网络的;那vSwitch又是如何连入外部物理网络环境&…

学霸真的比学渣更讨女孩子欢心吗?

全世界只有3.14 % 的人关注了爆炸吧知识表白难,难于追女神理工男,难于上青天最近小天回过头去追一部剧剧里的物理学霸顾未易顶着一张撕漫脸用薛定谔方程写下浪漫情书 却被女方认为:炫技 难道理工男在情话这方面真就不能拥有姓名吗&#xff1f…

游戏运营杂谈之-----IB推荐算法

最近比较累,也比较忙,有些东西没来得及写给各位,这里抱歉了,无论是否对错,都只是鄙人一家之言,还请见谅,有错欢迎指出,并加以改之。 什么是IB推荐算法,说白了就是当玩家在…

Java Socket实战之四 传输压缩对象

2019独角兽企业重金招聘Python工程师标准>>> 本文地址:http://blog.csdn.net/kongxx/article/details/7259834 Java Socket实战之一 单线程通信 Java Socket实战之二 多线程通信 Java Socket实战之三 传输对象 上一篇文章说到了用Java Socket来传输对象&…

批量提取文件创建时间_不要眨眼!批量提取文件名,只需30秒

私信回复关键词【工具】~获取Excel高效小工具合集!让你的Excel效率开挂~众所周知,「复制粘贴」可以解决 Excel 中出现的大多数问题。那我们为什么还要学习 Excel 相关技巧???因为,「复制粘贴」费时费力呀&a…

“妈,你当年咋看上我爸的?”网友晒爸妈结婚照,笑抽了!

全世界只有3.14 % 的人关注了爆炸吧知识最近看到网上有人问什么事情让你开始怀疑人生一网友回答看到我爹妈的结婚照我开始怀疑人生我怀疑我妈当时被我爸绑架了▼妈,有啥想不开的好好说或者你告诉我我爸到底是有什么特殊才艺吸引了你▼爸!我知道你娶到我妈…

【转】卖场开设社区便利店,不仅卖货,还有家政服务、售后衔接等(图)

台海网(微博)6月1日讯 (海峡导报记者 孙春燕/文 吴晓平/图)家门口开天虹便利店了,不仅有食品、水果,还有家政服务。  昨天,导报记者走访市场发现,厦门天虹第一家社区便利店“微喔”已于两周前悄然开业&am…

巴巴运动网学习笔记(16-20)

1.ProductType的JPA映射 View Code 1 Entity 2 public class ProductType { 3 private int id; 4 private String name; 5 private String note; 6 private boolean visible true; 7 private Set<ProductType> child; 8 private ProductType p…

批量生成 Gitee 仓库克隆命令的方法

当我们在一个新的公司入职或者发现一个很有意思的开源项目作者时&#xff0c;我们可能需要或者很想将该公司或作者的所有开源项目都克隆到本地慢慢研究。于是&#xff0c;笔者制作出了一段脚本可以一波将页面上的所有仓库生成克隆命令&#xff1a;var tmp []; $(.repository).…

Heartbeat+httpd+NFS 实现高可用的Web服务器

一、环境系统:CentOS 6.4x64位最小化安装nfs:192.168.3.31node1:192.168.3.32node2:192.168.3.33vip:192.168.3.34二、拓扑图三、前提条件1.节点之间主机名互相解析node1,node2:[rootheatbeat-node1 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost…

VS2005混合编译ARM汇编代码

2019独角兽企业重金招聘Python工程师标准>>> 在开发过程中&#xff0c;发现简单的在Storage Memory区域拷贝或粘贴文件不能达到硬件量测的要求&#xff0c;需要直接通过编写ARM汇编指令让CPU直接对Memory进行读写数据。 以前没有用VS2005编写过汇编代码&#xff0c;…

中国最险六大寺庙,最后一座至今无人登临

全世界只有3.14 % 的人关注了爆炸吧知识来源&#xff1a;「风景线」佛教远离尘世的特性使得很多寺庙修建于偏僻险要的山野&#xff0c;看似岌岌可危的建筑&#xff0c;却能屹立千百年而不倒&#xff0c;这不得不感叹古人智慧的伟大&#xff0c;这6大险要寺庙&#xff0c;绝对能…

c/c++ code JSON

cJSON 初体验 cJSON是一个超轻巧&#xff0c;携带方便&#xff0c;单文件&#xff0c;简单的可以作为ANSI-C标准的JSON解析器。官网地址 cJSON.c /*Copyright (c) 2009 Dave GamblePermission is hereby granted, free of charge, to any person obtaining a copyof this softw…

Dapr牵手.NET学习笔记:发布-订阅

queue&#xff0c;是很好的削峰填谷工具&#xff0c;在业内也是主流&#xff1b;发布订阅&#xff0c;可以有效的解耦两个应用&#xff0c;所以dapr把他们进行了有效的封装&#xff0c;我们使用起来更简单高效。本篇的案例是下完订单后&#xff0c;会把消息发布到redis&#xf…

sql年月日24小时制_Power Query 抓取气象台24小时降水量数据

我们借鉴之前抓取台风路径数据的例子&#xff0c;试一试抓取降水量数据&#xff1a;之前我们访问过这个网站&#xff0c;也试着抓取过数据&#xff0c;不过在谷歌浏览器中我们只能够找到两天的数据&#xff0c;但是通过台风路径数据抓取&#xff0c;我们猜想只要我们向服务器提…

薅羊毛丨5个平价好物,终于终于终于打折了!

▲ 点击查看大家好&#xff0c;超模全新的固定栏目「薅羊毛」上线了&#xff01;既然是薅羊毛&#xff0c;怎么能空着手来&#xff1f;别看今天是草单&#xff0c;但所有产品都是咱们商务部小哥谈了好久才拿下的团购&#xff0c;而且全都包邮。毕竟好用的好吃的&#xff0c;啥都…

Docker小白到实战之Docker Compose在手,一键足矣

前言Docker可以将应用程序及环境很方便的以容器的形式启动&#xff0c;但当应用程序依赖的服务比较多&#xff0c;或是遇到一个大系统拆分的服务很多时&#xff0c;如果还一个一个的根据镜像启动容器&#xff0c;那就有点累人了&#xff0c;到这有很多小伙伴会说&#xff1a;弄…