antecedente de la opinión
Hemos completado previamente implementaciones lógicas de consumo kafka, y poner noticias elasticsearch, a continuación, echa un vistazo a nuestras herramientas de visualización de registros Kibana.
Este objetivo sección
Anteriormente acaba de terminar el consumo de noticias kafka, y poner elástica, esto mejorará el proyecto para que apoye la actualización caliente es que cuando config.yaml en el seguimiento del registro de cambios, o los datos ETCD ha cambiado dinámicamente iniciar el monitor nuevo registro corrutina cerca cancelar la co-rutina de monitoreo de registro.
Nueva Co Chengzi Qi variable de control móvil
Agregue el siguiente código kafkaconsumer.go
var topicMap mapa [cadena] mapa [int32] * TopicData var map topicSet [cadena] bool var etcd_topicSet mapa [cadena] bool var etcd_topicMap mapa [cadena] mapa [int32] * TopicData var topicChan Chan * TopicPart var etcd_topicChan Chan * TopicPart var consumer_list [] sarama.Consumer var etcdcli * clientv3.Client func init () { topicMap = marca (mapa [cadena] mapa [int32] * TopicData) etcd_topicMap = marca (mapa [cadena] mapa [int32] * TopicData) topicSet = make ( mAP [string] bool) etcd_topicSet = make (map [string] bool) topicChan = make (Chan * TopicPart, 20) etcd_topicChan = make (Chan * TopicPart, 20) consumer_list = make ([] sarama.Consumer, 0, 20) }
topicMap tema y de los parámetros de registro almacenados config.yaml corrutina directamente grabada, etcd_topicMap utilizan para registrar y parámetros tema ETCD corrutina registrados.
topicSet para el registro de tema config.yaml directamente grabó, tema etcd_topicSet ETCD para la grabación grabada.
Cuando el registro de escritura topicChan anormal accidente corrutina elástica monitoreo, para devolver la información tema Chan, nos encontramos entonces el tema correspondiente reiniciado con el topicMap corrutina.
El tema etcd_topicChan corrutina almacena ETCD, el proceso de seguimiento de etlastic, si se bloquea el co-rutina, etcd_topicMap encontrar el tema que corresponde reiniciado con la co-rutina.
consumer_list salvó kafka lista de los consumidores.
ETCD etcdcli el cliente para el manejo de lector ETCD.
El conjunto configurado tema de configuración de registro generado
func ConstructTopicSet () mapa [cadena] {bool topicSetTmp: = marca (mapa [cadena] bool) configtopics, _: = logconfig.ReadConfig (logconfig.InitVipper () "collectlogs") si configtopics == nil { Goto CONFTOPIC } para _, configtopic: = oscilan configtopics ([] interfaz {}) {. confmap: = configtopic (mapa [interfaz {}] interfaz {}). para key, val: = confmap gama { . Si la clave (string) == " logtopic"{ topicSetTmp [. val (cadena)] = true } } } CONFTOPIC: retorno topicSetTmp }
etcdconsumer.go GetTopicSet leído por el tema de la vida y el conjunto ETCD
val adquisición según ETCD clave de configuración configurado, y luego genera un tema conjunto adquirida
func GetTopicSet (CLI * clientv3.Client) (interfaz de {}, el error) { etcdKeys, etcdres: = logconfig.ReadConfig (logconfig.InitVipper (), "etcdkeys") Si etcdres { fmt.Println ( "leer config etcdkeys fallidos" ) nula rentabilidad, errors.New ( "leer config etcdkeys fallido") } fmt.Println (reflect.TypeOf (etcdKeys)) topicSet: = marca (mapa [cadena] bool) para _, keyval:. = etcdKeys rango ([] interfaz {}) { ctxtime, cancelación: = context.WithTimeout (context.Background (), time.Second) respectivamente, se equivocan: = cli.Get (. ctxtime, keyval (cadena)) Cancelar () ! = nil si err { fmt.Println ( "Get falló, err:", err) continúe } para _, EV: resp.Kvs = {rango fmt.Printf ( "% s:% s ... \ n", ev.Key, ev.Value) etcdLogConf: = make ([] * etcdlogconf.EtcdLogConf, 0, 20) unmarsherr: = json.Unmarshal (ev. valor, y etcdLogConf) si unmarsherr = nil {! fmt.Println ( "error unmarshal, el error es!", unmarsherr) continúe } para _, etcdval: = oscilan etcdLogConf { topicSet [etcdval.Topic] = true } } } regreso topicSet, nil }
Puesto en el mapa, y luego comienza la co-rutina de configuración
func ConvertSet2Map (consumidor sarama.Consumer, mapa topicSet [cadena] bool, topicMaps mapa [cadena] mapa [int32] * TopicData, topic_chan Chan * TopicPart) { para key, _: = {oscilan topicSet partitionList, err: = consumer.Partitions (clave) Si ERR = nil {! fmt.Println ( "conseguir particiones de consumo fracasaron") fmt.Println ( "error", err.Error ()) continuará } para la partición: = variar partitionList { pc, err: = consumidor .ConsumePartition (clave, int32 (partición), sarama.OffsetNewest) Si ERR = nil {! fmt.Println ( "consumir error de la partición es", err.Error ()) continuará } // Defer pc.AsyncClose () topicData: = nueva (TopicData) topicData.Ctx, topicData.Cancel = context.WithCancel (context.Background ()) topicData.KafConsumer = pc topicData.TPartition = new (TopicPart) topicData.TPartition.Partition = int32 (partición) topicData.TPartition.Topic = clave _, OKM: = topicMaps [clave] Si OKM { topicMaps [clave] = Marca (MAP [Int32] * TopicData) } topicMaps [clave] [int32 (partición)] = topicData ir PutIntoES (topicData, topic_chan) } } }
Kafka lee en el mensaje, y llama a la función anterior comienza a monitorizar es corrutina
Kafka leer información de, y luego genera un conjunto de mapas de acuerdo a la configuración y iniciar la supervisión es corrutina
func ConsumeTopic (sarama.Consumer consumidor) { ConvertSet2Map (consumidor, topicSet, topicMap, topicChan) ConvertSet2Map (consumidor, etcd_topicSet, etcd_topicMap, etcd_topicChan) //监听配置文件 ctx, cancelar: = context.WithCancel (context.Background ()) pathChan : = make (Chan interfaz {}) etcdChan: = make (Chan interfaz {}) ir logconfig.WatchConfig (CTX, logconfig.InitVipper (), pathChan, etcdChan) Defer func (cancelar context.CancelFunc) { consumer_once.Do (func () { Si ERR:! = recuperarse (); err = nil { fmt.Println ( "principal pánico goroutine consumidor", err) } cancelar () }) } (cancelar) para { seleccionar { //检测监控路径的协程崩溃,重启 topicpart caso: = <-topicChan: fmt.Printf ( "el recibir goroutines la Exited, Tema% S es, es partición% D \ n-", topicpart.Topic, topicpart.Partition) datos de los consumidores // reinicio de lectura corrutina val , OK: = topicMap [topicpart.Topic] SI OK {! Continuar } TP, OK: Val = [topicpart.Partition] ! SI OK { Continuar } tp.Ctx, tp.Cancel = context.WithCancel (context.Background () ) Go PutIntoES (TP, topicChan) // analizar la configuración ETCD detección, seguimiento accidente camino corrutina, reiniciar Case topicpart: = <-etcd_topicChan: fmt.Printf ( "el recibir goroutines la Exited, Tema% S es, es partición% D \ n", val, OK: = etcd_topicMap [topicpart.Topic ] topicpart.Topic, topicpart.Partition) // leer la co-rutina de reinicio de datos de consumidores para logkey, logval :. = chval Rango (Mapa [interfaz de {}] interfaz de { }) { Si bien {! continuarán } tp, bien: val = [topicpart.Partition] Si bien { seguir } tp.Ctx, tp.Cancel = context.WithCancel (context.Background ()) ir PutIntoES (tp, etcd_topicChan) //检测vipper监控返回配置的更新 pathchange caso, bien: = <-pathChan: Si bien { fmt.Println ( "goroutine reloj vipper salió") Goto LoopEnd } //fmt.Println(pathchange) topicSetTemp: = marca (mapa [ string] bool) para _, chval:. = pathchange gama ([] interfaz {}) { si logkey (string) == "logtopic" {. topicSetTemp [logval (string)] = TRUE. } } } UpdateTopicLogRoutine (topicSetTemp) //fmt.Println(topicSetTemp) caso etcdchange, OK: = <-etcdChan: Si bien { FMT .println ( "goroutine reloj vipper extied") Goto LoopEnd } fmt.Println (etcdchange) topicsetTemp, err: = etcdconsumer.GetTopicSet (etcdcli) ! Si ERR = nil { seguir } UpdateEtcdTopicLogRoutine (. topicsetTemp (mapa [cadena] bool)) } } LoopEnd: fmt.Printf ( "para salido") }
Ir logconfig.WatchConfig corrutina inicio, configuración de monitor de llamada vipper, tema cuando está equipado con actualizaciones de manejo actualizado co-rutina consumidor.
Al mismo tiempo en que la manutención de menores corrutina colapso anormal, corrutina consumidor reiniciar la co-rutina.
Por información de registro Kibana
Kibana en el manejo de la gestión, y el nuevo índice, el índice elástico es que tema conjunto, por lo que tenemos unos cuantos nuevo índice,
etcd_log, golang_log, logdir2.
Entonces Kibana se puede ver en varias de la información del registro de índice
fuente descarga
https://github.com/secondtonone1/golang-/tree/master/logcatchsys
gracias a mi preocupación pública No.