P170 内容回顾
P171 今日内容
P172 ES介绍
logtranfer相当于把日志从kafka搬到es里。
GitHub的检索其实就是用的es
type是索引的逻辑类别/分区,语义是以使用者来变。
es和mysql的概念对比:
es的index相当于mysql的database。
type对应 表的概念。
document相当于数据行 的意思。
field对应数据字典
mapping对应mysql的schem
启动,默认是在9200端口
P173 ES搭建及常见API示例
es 的使用都是走restful api的
索引可以对应传统数据库的database
创建一个索引www,index就是数据库
user是个数据库,person就是类型
index是student,type是类型
传一下数据进去
进行一个检索,从student库里进行一个search
查询相关
require (
github.com/olivere/elastic/v7 v7.0.4
)
package main
import (
"context"
"fmt"
"github.com/olivere/elastic/v7"
)
// Elasticsearch demo
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Married bool `json:"married"`
}
func main() {
client, err := elastic.NewClient(elastic.SetURL("http://192.168.1.7:9200"))
if err != nil {
// Handle error
panic(err)
}
fmt.Println("connect to es success")
p1 := Person{Name: "rion", Age: 22, Married: false}
put1, err := client.Index().
Index("user").
BodyJson(p1).
Do(context.Background())
if err != nil {
// Handle error
panic(err)
}
fmt.Printf("Indexed user %s to index %s, type %s\n", put1.Id, put1.Index, put1.Type)
}
可以指定查询的size
P174 go操作ES
package main
import (
"context"
"fmt"
"github.com/olivere/elastic/v7"
)
// Elasticsearch demo
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Married bool `json:"married"`
}
func main() {
client, err := elastic.NewClient(elastic.SetURL("http://192.168.1.7:9200"))
if err != nil {
// Handle error
panic(err)
}
fmt.Println("connect to es success")
p1 := Person{Name: "rion", Age: 22, Married: false}
put1, err := client.Index().
Index("user").
BodyJson(p1).
Do(context.Background())
if err != nil {
// Handle error
panic(err)
}
fmt.Printf("Indexed user %s to index %s, type %s\n", put1.Id, put1.Index, put1.Type)
}
下载安装依赖
相当于构造一个 新的es客户端
第一步是初始化连接
调用方法
看之前的操作示例里的链式操作
创建的时候初始化一个连接,对应到索引里
P175 kafka消费示例
拿到一个分区,尝试去每一个分区里消费数据
连接kafka消费消息
package main
import (
"fmt"
"github.com/Shopify/sarama"
)
// kafka consumer
func main() {
consumer, err := sarama.NewConsumer([]string{"127.0.0.1:9092"}, nil)
if err != nil {
fmt.Printf("fail to start consumer, err:%v\n", err)
return
}
partitionList, err := consumer.Partitions("web_log") // 根据topic取到所有的分区
if err != nil {
fmt.Printf("fail to get list of partition:err%v\n", err)
return
}
fmt.Println(partitionList)
for partition := range partitionList { // 遍历所有的分区
// 针对每个分区创建一个对应的分区消费者
pc, err := consumer.ConsumePartition("web_log", int32(partition), sarama.OffsetNewest)
if err != nil {
fmt.Printf("failed to start consumer for partition %d,err:%v\n", partition, err)
return
}
defer pc.AsyncClose()
// 异步从每个分区消费信息
go func(sarama.PartitionConsumer) {
for msg := range pc.Messages() {
fmt.Printf("Partition:%d Offset:%d Key:%v Value:%v", msg.Partition, msg.Offset, msg.Key, msg.Value)
}
}(pc)
}
}
先启动一个zookeeper,2181端口
启动一个kafka
或者sarama需要改成1.19
修改go mod里的require,下面tidy是校验,查看缓存代码里的版本和gomod的一致不一致
启动etcd
key是ip
之前的etcdput,往etcd里设置值
现在就等文件里写日志了
写一些信息到日志文件里
logagent就收集到了
消费者没收到消息因为没往下走
kafka消费者,最后加–from-beginning
现在就拿到数据了
字节类型才能用string接收
现在是用go写消费者,从kafka里把数据读出来展示出来
P176 Kibana搭建及使用
kibana集成了es的搜索和展示
下载好后,修改配置文件,下载的版本 需要跟ES一致
启动kibana
创建索引
创建索引
现在就能收到日志了
P177 logtransfer实现
1.将日志从kafka取出来发往es上
0.加载配置文件
1.初始化
1.从kafka取日志数据
2.发往es
写配置文件
现在值是空的
现在要设置声明,不然在配置文件里找不到kafkacfg开头的,得到的就是空
现在就可以获得值了
new反应对应类型的指针
1。在一个函数中修改变量一定要传指针。
2.在配置文件对应的结构体中一定要设置tag特别是嵌套的结构体
加载完配置后,就是初始化kafka
在main函数里调用初始化函数
后台的goroutine一直消费数据发送给es
初始化es,准备接收kafka过来的消息
还有发送数据到es的操作,所以需要写一个send方法,client提出去,作为一个全局 的
写一个sendtoes方法
造一个结构体,把数据传到es里
unMarshall。使用方法,前面数据,后面是接收变量的指针
json导入未encoding/json
1.先初始化es,创建一个连接的client,再初始化kafka,
2.连接kafka,创建分区消费者,
3.每个分区的消费者分别取出数据,通过sendtoes,将数据发往es。
先启动logagent
现在去kibana查数据
安装一个中文分词器IK
初始化es的时候只要创建一个client,提供一个对外往es写数据的函数
根据分区创建消费者,Kafka可能会把topic放到不同分区,有一个分区就去消费一个。
每个分区创建一个消费者,通过sendtos发送数据至es
重启es
启动logtransfer
P178 logstransfer优化
这里是函数调用函数,可以进行优化
把topic也放进去
chansize先写死成100000
这里是往channel里去
在init调用前初始化
传一个topic
bodyJSon这个地方必须要能被json格式化的一个go里的结构体类型
这样就能收到日志了
把chansize也提到配置文件里
main函数里通过cfg.EScfg.chansize读到配置
也可以用多个goroutine写
这样就开了16个goroutine去写
P179 prometheus和grafana介绍
windows下没有indoes
CPU
采集CPU相关信息。
import "github.com/shirou/gopsutil/cpu"
// cpu info
func getCpuInfo() {
cpuInfos, err := cpu.Info()
if err != nil {
fmt.Printf("get cpu info failed, err:%v", err)
}
for _, ci := range cpuInfos {
fmt.Println(ci)
}
// CPU使用率
for {
percent, _ := cpu.Percent(time.Second, false)
fmt.Printf("cpu percent:%v\n", percent)
}
}
获取CPU负载信息:
import "github.com/shirou/gopsutil/load"
func getCpuLoad() {
info, _ := load.Avg()
fmt.Printf("%v\n", info)
}
influxdb只有商业的可以做集群
short-lived-jobs短时服务,找到一个统一的网关pushgateway,prometheus去gateway里拉数据
先启动prometheus
![](https://img-blog.csdnimg.cn/5d6c8a04cd1e40098ef958064a78d719.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBANDhONkU=,size_19,color_FFFFFF,t_70,g_se,x_16)
监控开启了多少个goroutine
启动grafana
配置数据源
alertmanager是管理告警的
P180 项目总结
P181 gin的介绍
自动下载到go的src下