-
Notifications
You must be signed in to change notification settings - Fork 395
/
history.go
118 lines (100 loc) · 2.61 KB
/
history.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/**
* Tencent is pleased to support the open source community by making Polaris available.
*
* Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the BSD 3-Clause License (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://opensource.org/licenses/BSD-3-Clause
*
* Unless required by applicable law or agreed to in writing, software distributed
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package plugin
import (
"os"
"sync"
"github.com/polarismesh/polaris/common/model"
)
var (
// historyOnce Plugin initialization atomic variable
historyOnce sync.Once
compositeHistory *CompositeHistory
)
// History 历史记录插件
type History interface {
Plugin
Record(entry *model.RecordEntry)
}
// GetHistory Get the historical record plugin
func GetHistory() History {
if compositeHistory != nil {
return compositeHistory
}
historyOnce.Do(func() {
var (
entries []ConfigEntry
)
if len(config.History.Entries) != 0 {
entries = append(entries, config.History.Entries...)
} else {
entries = append(entries, ConfigEntry{
Name: config.History.Name,
Option: config.History.Option,
})
}
compositeHistory = &CompositeHistory{
chain: make([]History, 0, len(entries)),
options: entries,
}
if err := compositeHistory.Initialize(nil); err != nil {
log.Errorf("History plugin init err: %s", err.Error())
os.Exit(-1)
}
})
return compositeHistory
}
type CompositeHistory struct {
chain []History
options []ConfigEntry
}
func (c *CompositeHistory) Name() string {
return "CompositeHistory"
}
func (c *CompositeHistory) Initialize(config *ConfigEntry) error {
for i := range c.options {
entry := c.options[i]
item, exist := pluginSet[entry.Name]
if !exist {
log.Errorf("plugin History not found target: %s", entry.Name)
continue
}
history, ok := item.(History)
if !ok {
log.Errorf("plugin target: %s not History", entry.Name)
continue
}
if err := history.Initialize(&entry); err != nil {
return err
}
c.chain = append(c.chain, history)
}
return nil
}
func (c *CompositeHistory) Destroy() error {
for i := range c.chain {
if err := c.chain[i].Destroy(); err != nil {
return err
}
}
return nil
}
func (c *CompositeHistory) Record(entry *model.RecordEntry) {
for i := range c.chain {
c.chain[i].Record(entry)
}
}