Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
L
logtransfer
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
谢宇轩
logtransfer
Commits
2703e667
Commit
2703e667
authored
Dec 31, 2021
by
谢宇轩
😅
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加状态监控!
parent
a9e90bb1
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
165 additions
and
35 deletions
+165
-35
etcd.go
conf/etcd.go
+9
-16
collector.go
source/collector.go
+152
-15
kernel.go
transfer/kernel.go
+4
-4
No files found.
conf/etcd.go
View file @
2703e667
...
@@ -104,22 +104,7 @@ func GetConfFromEtcd(name string) (EtcdValue, error) {
...
@@ -104,22 +104,7 @@ func GetConfFromEtcd(name string) (EtcdValue, error) {
var
value
EtcdValue
var
value
EtcdValue
ctx
,
cancel
:=
context
.
WithTimeout
(
context
.
Background
(),
time
.
Second
)
ctx
,
cancel
:=
context
.
WithTimeout
(
context
.
Background
(),
time
.
Second
)
resp
,
err
:=
cli
.
Get
(
ctx
,
statusPath
+
name
)
resp
,
err
:=
cli
.
Get
(
ctx
,
configPath
+
name
)
cancel
()
if
err
!=
nil
{
log
.
Println
(
fmt
.
Sprintf
(
"Get Etcd config failed, err:%s
\n
"
,
err
))
}
if
len
(
resp
.
Kvs
)
==
0
{
return
value
,
fmt
.
Errorf
(
"status error"
)
}
status
:=
string
(
resp
.
Kvs
[
0
]
.
Value
)
if
status
!=
"1"
{
return
value
,
fmt
.
Errorf
(
"status error"
)
}
ctx
,
cancel
=
context
.
WithTimeout
(
context
.
Background
(),
time
.
Second
)
resp
,
err
=
cli
.
Get
(
ctx
,
configPath
+
name
)
cancel
()
cancel
()
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -185,6 +170,14 @@ func WatchLogConfigToEtcd() clientv3.WatchChan {
...
@@ -185,6 +170,14 @@ func WatchLogConfigToEtcd() clientv3.WatchChan {
return
wch
return
wch
}
}
func
WatchLogStatusToEtcd
()
clientv3
.
WatchChan
{
wch
:=
cli
.
Watch
(
context
.
Background
(),
statusPath
,
clientv3
.
WithPrefix
())
return
wch
}
func
CheckAgentActive
(
name
string
)
bool
{
func
CheckAgentActive
(
name
string
)
bool
{
ctx
,
cancel
:=
context
.
WithTimeout
(
context
.
Background
(),
time
.
Second
)
ctx
,
cancel
:=
context
.
WithTimeout
(
context
.
Background
(),
time
.
Second
)
...
...
source/collector.go
View file @
2703e667
...
@@ -69,19 +69,20 @@ func LoadCollectors() ([]Collector, error) {
...
@@ -69,19 +69,20 @@ func LoadCollectors() ([]Collector, error) {
return
collectors
,
nil
return
collectors
,
nil
}
}
// 加载所有的collector
// 加载Agent所有的collector
func
LoadCollector
(
name
string
)
Collector
{
func
LoadCollector
(
name
string
)
([]
Collector
,
error
)
{
var
collectors
[]
Collector
config
,
err
:=
conf
.
GetConfFromEtcd
(
name
)
config
,
err
:=
conf
.
GetConfFromEtcd
(
name
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Print
f
(
"get etcd config err : err: %s"
,
err
)
return
collectors
,
fmt
.
Error
f
(
"get etcd config err : err: %s"
,
err
)
}
}
var
collector
Collector
err
=
json
.
Unmarshal
(
config
,
&
collector
)
err
=
json
.
Unmarshal
(
config
,
&
collector
s
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Printf
(
"json decode config(%s) err : err: %s"
,
collector
,
err
)
return
collectors
,
fmt
.
Errorf
(
"json decode config(%s) err : err: %s"
,
collectors
,
err
)
}
}
return
collector
return
collector
s
,
nil
}
}
// 收集所有需要监听的topic
// 收集所有需要监听的topic
...
@@ -136,7 +137,7 @@ func TopicChangeListener() <-chan *Topic {
...
@@ -136,7 +137,7 @@ func TopicChangeListener() <-chan *Topic {
return
watchTopicChannel
return
watchTopicChannel
}
}
func
TopicDeleteListener
()
<-
chan
string
{
func
TopicDeleteListener
()
<-
chan
string
{
return
deleteTopicChannel
return
deleteTopicChannel
}
}
...
@@ -144,7 +145,6 @@ func TopicStartListener() <-chan *Topic {
...
@@ -144,7 +145,6 @@ func TopicStartListener() <-chan *Topic {
return
startTopicChannel
return
startTopicChannel
}
}
func
WatchTopics
()
{
func
WatchTopics
()
{
for
confResp
:=
range
conf
.
WatchLogTopicToEtcd
()
{
for
confResp
:=
range
conf
.
WatchLogTopicToEtcd
()
{
...
@@ -177,21 +177,107 @@ func WatchTopics() {
...
@@ -177,21 +177,107 @@ func WatchTopics() {
}
}
log
.
Println
(
"some Topic remove"
,
oldTopic
.
Name
)
log
.
Println
(
"some Topic remove"
,
oldTopic
.
Name
)
// TODO: 以防万一查一下
}
}
time
.
Sleep
(
2
*
time
.
Second
)
time
.
Sleep
(
2
*
time
.
Second
)
}
}
}
}
}
}
func
WatchStatus
()
{
for
confResp
:=
range
conf
.
WatchLogStatusToEtcd
()
{
// 如果是关闭的Agent 这些可以忽略的!!!
agentKey
:=
string
(
confResp
.
Events
[
0
]
.
Kv
.
Key
)
currentChangedkey
:=
agentKey
[
strings
.
LastIndex
(
agentKey
,
"/"
)
+
1
:
]
// 只有开启的才去更改配置
for
_
,
event
:=
range
confResp
.
Events
{
switch
event
.
Type
{
case
mvccpb
.
PUT
:
if
len
(
confResp
.
Events
)
==
0
{
continue
}
// 如果是1 name就是从0开启的(开启)
// 如果是0有可能是从1关闭的(关闭),也有可能是突然新增的(无视)
collectors
,
status
,
err
:=
getStatusChangeWithEvent
(
confResp
)
if
err
!=
nil
{
log
.
Println
(
"Get Status Active Event Info Error:"
,
err
)
continue
}
log
.
Println
(
"STATUS CHANGE"
,
status
)
switch
status
{
case
"CREATED"
:
// 情况三 可以不进行操作
// 不会出现,因为初始化的时候一定是关闭的。
log
.
Println
(
"Add Agent Empty Status :"
,
currentChangedkey
)
case
"CLOSE"
:
for
_
,
c
:=
range
collectors
{
log
.
Println
(
"有collector离开"
)
// 获取config prefix 全部collector,判断是否是最后一个用这个topic的collector
currentAbleCollector
,
err
:=
LoadCollectors
()
if
err
!=
nil
{
log
.
Println
(
"Get Current Able Collector Error:"
,
err
)
continue
}
var
set
=
make
(
map
[
string
]
bool
)
for
_
,
v
:=
range
currentAbleCollector
{
set
[
v
.
Topic
]
=
true
}
if
!
set
[
c
.
Topic
]
{
// 可以删了
deleteTopicChannel
<-
c
.
Topic
log
.
Println
(
currentChangedkey
,
"Agent Close Delete Collector with Topic Customer left"
,
c
.
Topic
)
continue
}
log
.
Println
(
currentChangedkey
,
"Agent Close with Close Collector"
,
c
)
}
case
"OPEN"
:
for
_
,
c
:=
range
collectors
{
_
,
ok
:=
GetCustomer
(
c
.
Topic
)
// 如果首次出现 那就初始化这个Topic了
// 根据topicname去获取TopicConfig
if
!
ok
{
changedConf
,
err
:=
conf
.
GetTopicFromEtcd
(
c
.
Topic
)
if
err
!=
nil
{
log
.
Println
(
"Load Agent Open New Puted Topic Config Error:"
,
err
)
continue
}
// 有PUT操作才进行通知
var
newPutTopicCondfig
TopicConfig
err
=
json
.
Unmarshal
(
changedConf
,
&
newPutTopicCondfig
)
if
err
!=
nil
{
log
.
Println
(
"Unmarshal Agent Open New Puted Topic Config Error:"
,
err
)
continue
}
log
.
Println
(
"load Agent New Puted Topic success!"
)
startTopicChannel
<-
generateTopic
(
newPutTopicCondfig
)
log
.
Println
(
currentChangedkey
,
"Agent open with open Collector And Init Topic Customer"
,
c
)
}
log
.
Println
(
currentChangedkey
,
"Agent open with open Collector, But has opend"
,
c
)
}
default
:
log
.
Println
(
"Get Status Active Event Info Unkonw Error"
)
}
}
}
}
}
func
WatchConfigs
()
{
func
WatchConfigs
()
{
for
confResp
:=
range
conf
.
WatchLogConfigToEtcd
()
{
for
confResp
:=
range
conf
.
WatchLogConfigToEtcd
()
{
// 如果是关闭的Agent 这些可以忽略的!!!
// 如果是关闭的Agent 这些可以忽略的!!!
agentKey
:=
string
(
confResp
.
Events
[
0
]
.
Kv
.
Key
)
agentKey
:=
string
(
confResp
.
Events
[
0
]
.
Kv
.
Key
)
currentChangedkey
:=
agentKey
[
strings
.
LastIndex
(
agentKey
,
"/"
)
+
1
:
]
currentChangedkey
:=
agentKey
[
strings
.
LastIndex
(
agentKey
,
"/"
)
+
1
:
]
if
!
conf
.
CheckAgentActive
(
currentChangedkey
){
if
!
conf
.
CheckAgentActive
(
currentChangedkey
)
{
continue
continue
}
}
// 只有开启的才去更改配置
// 只有开启的才去更改配置
...
@@ -242,7 +328,7 @@ func WatchConfigs() {
...
@@ -242,7 +328,7 @@ func WatchConfigs() {
log
.
Println
(
"load Agent New Puted Topic success!"
)
log
.
Println
(
"load Agent New Puted Topic success!"
)
startTopicChannel
<-
generateTopic
(
newPutTopicCondfig
)
startTopicChannel
<-
generateTopic
(
newPutTopicCondfig
)
log
.
Println
(
currentChangedkey
,
"Agent Add Collector And Init Topic"
,
diff
)
log
.
Println
(
currentChangedkey
,
"Agent Add Collector And Init Topic
Customer
"
,
diff
)
}
}
log
.
Println
(
currentChangedkey
,
"Agent Add Collector"
,
diff
)
log
.
Println
(
currentChangedkey
,
"Agent Add Collector"
,
diff
)
case
"DEL"
:
case
"DEL"
:
...
@@ -261,7 +347,9 @@ func WatchConfigs() {
...
@@ -261,7 +347,9 @@ func WatchConfigs() {
if
!
set
[
diff
.
Topic
]
{
if
!
set
[
diff
.
Topic
]
{
// 可以删了
// 可以删了
deleteTopicChannel
<-
diff
.
Topic
deleteTopicChannel
<-
diff
.
Topic
log
.
Println
(
currentChangedkey
,
"Agent Delete Collector with Topic Customer left"
,
diff
)
continue
}
}
log
.
Println
(
currentChangedkey
,
"Agent Delete Collector"
,
diff
)
log
.
Println
(
currentChangedkey
,
"Agent Delete Collector"
,
diff
)
...
@@ -402,3 +490,52 @@ func getCollectorChangeWithEvent(confResp clientv3.WatchResponse) (different Col
...
@@ -402,3 +490,52 @@ func getCollectorChangeWithEvent(confResp clientv3.WatchResponse) (different Col
return
different
,
changeType
,
err
return
different
,
changeType
,
err
}
}
func
getStatusChangeWithEvent
(
confResp
clientv3
.
WatchResponse
)
(
collectors
[]
Collector
,
changeType
string
,
err
error
)
{
changeStatus
:=
fmt
.
Sprintf
(
"%s"
,
confResp
.
Events
[
0
]
.
Kv
.
Value
)
// 先对比一下
oldKey
:=
confResp
.
Events
[
0
]
.
Kv
.
Key
rev
:=
confResp
.
Events
[
0
]
.
Kv
.
ModRevision
-
1
oldValue
,
err
:=
conf
.
GetDelRevValueFromEtcd
(
string
(
oldKey
),
rev
)
if
err
!=
nil
{
if
len
(
oldValue
)
==
0
{
// 新来的可以无视
changeType
=
"CREATE"
err
=
nil
return
collectors
,
changeType
,
err
}
return
collectors
,
changeType
,
err
}
// 获取这个agent的内容
agentKey
:=
string
(
confResp
.
Events
[
0
]
.
Kv
.
Key
)
currentChangedkey
:=
agentKey
[
strings
.
LastIndex
(
agentKey
,
"/"
)
+
1
:
]
AllCollectors
,
err
:=
LoadCollector
(
currentChangedkey
)
if
err
!=
nil
{
return
collectors
,
changeType
,
err
}
changeType
=
"CLOSE"
if
changeStatus
==
"1"
{
changeType
=
"OPEN"
}
var
topicSet
=
make
(
map
[
string
]
bool
)
for
_
,
c
:=
range
AllCollectors
{
if
topicSet
[
c
.
Topic
]
{
continue
}
topicSet
[
c
.
Topic
]
=
true
collectors
=
append
(
collectors
,
c
)
}
return
collectors
,
changeType
,
err
}
transfer/kernel.go
View file @
2703e667
...
@@ -44,13 +44,13 @@ func Run(confPath string) {
...
@@ -44,13 +44,13 @@ func Run(confPath string) {
go
TopicWatcherHandle
()
go
TopicWatcherHandle
()
// 监听
Agent Collector
变更
// 监听
Agent Collector
变更
go
source
.
WatchConfigs
()
go
source
.
WatchConfigs
()
// 还要监听
Topic
的配置变更
// 还要监听
Topic
的配置变更
go
source
.
WatchTopics
()
go
source
.
WatchTopics
()
// 还要监听 Status 的配置变更
// TODO: 监听Agent 启动状态变更
go
source
.
WatchStatus
()
for
sign
:=
range
sign
()
{
for
sign
:=
range
sign
()
{
switch
sign
{
switch
sign
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment