This is an automated email from the ASF dual-hosted git repository.
liujiapeng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-satellite.git
The following commit(s) were added to refs/heads/main by this push:
new ad503ba add plugin doc generator (#14)
ad503ba is described below
commit ad503ba8cfdc459f9c2624204c79c482abacf138
Author: Evan <[email protected]>
AuthorDate: Wed Jan 13 17:26:03 2021 +0800
add plugin doc generator (#14)
* add plugin doc generator
* add generate doc
* polish script
* polish script
* polish script
* polish script
* polish script
Co-authored-by: Evan <[email protected]>
---
.github/workflows/build-and-test.yaml | 4 +-
Makefile | 2 +
cmd/command.go | 19 +++--
cmd/main.go | 1 +
docs/plugin-description.md | 104 ++++++++++++++++++++++++
internal/pkg/plugin/registry.go | 10 +--
internal/satellite/tools/generate_plugin_doc.go | 89 ++++++++++++++++++++
plugins/fallbacker/timer/timer_fallbacker.go | 2 +-
plugins/queue/mmap/queue.go | 2 +-
9 files changed, 216 insertions(+), 17 deletions(-)
diff --git a/.github/workflows/build-and-test.yaml
b/.github/workflows/build-and-test.yaml
index edf6fc9..41823d3 100644
--- a/.github/workflows/build-and-test.yaml
+++ b/.github/workflows/build-and-test.yaml
@@ -47,8 +47,8 @@ jobs:
- name: Get dependencies
run: make deps
- - name: Check generate codes
- run: make gen && make check
+ - name: Check generate
+ run: make gen && make build && make check
- name: Lint
run: make lint
diff --git a/Makefile b/Makefile
index 097c632..95bf1a7 100644
--- a/Makefile
+++ b/Makefile
@@ -24,6 +24,7 @@ RELEASE_SRC = skywalking-satellite-$(VERSION)-src
OS = $(shell uname)
+SH = sh
GO = go
GIT = git
PROTOC = protoc
@@ -85,6 +86,7 @@ build: deps linux darwin
.PHONY: check
check:
$(MAKE) clean
+ $(OUT_DIR)/skywalking-satellite-latest-linux-amd64 docs
$(GO) mod tidy &> /dev/null
@if [ ! -z "`git status -s |grep -v 'go.mod\|go.sum'`" ]; then \
echo "Following files are not consistent with CI:"; \
diff --git a/cmd/command.go b/cmd/command.go
index 0fe3c18..e8c3f0b 100644
--- a/cmd/command.go
+++ b/cmd/command.go
@@ -22,6 +22,7 @@ import (
"github.com/apache/skywalking-satellite/internal/satellite/boot"
"github.com/apache/skywalking-satellite/internal/satellite/config"
+ "github.com/apache/skywalking-satellite/internal/satellite/tools"
)
var (
@@ -37,15 +38,17 @@ var (
},
},
Action: func(c *cli.Context) error {
-
- cfg := loadConfig(c)
+ configPath := c.String("config")
+ cfg := config.Load(configPath)
return boot.Start(cfg)
},
}
-)
-func loadConfig(c *cli.Context) *config.SatelliteConfig {
- configPath := c.String("config")
- cfg := config.Load(configPath)
- return cfg
-}
+ cmdDocs = cli.Command{
+ Name: "docs",
+ Usage: "generate satellite plugin docs",
+ Action: func(c *cli.Context) error {
+ return tools.GeneratePluginDoc()
+ },
+ }
+)
diff --git a/cmd/main.go b/cmd/main.go
index 0b51788..cbe819c 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -36,6 +36,7 @@ func main() {
app.Description = "A lightweight collector/sidecar could be deployed
closing to the target monitored system, to collect metrics, traces, and logs."
app.Commands = []*cli.Command{
&cmdStart,
+ &cmdDocs,
}
app.Action = cli.ShowAppHelp
_ = app.Run(os.Args)
diff --git a/docs/plugin-description.md b/docs/plugin-description.md
new file mode 100755
index 0000000..b5c977b
--- /dev/null
+++ b/docs/plugin-description.md
@@ -0,0 +1,104 @@
+# api.Client
+## kafka-client
+### description
+```this is a sharing client to delivery the data to Kafka.```
+### defaultConfig
+```
+# The Kafka broker addresses (default localhost:9092). Multiple values are
separated by commas.
+brokers: localhost:9092
+
+# The Kakfa version should follow this pattern, which is
major_minor_veryMinor_patch (default 1.0.0.0).
+version: 1.0.0.0
+
+# The TLS switch (default false).
+enable_TLS: false
+
+# The file path of client.pem. The config only works when opening the TLS
switch.
+client_pem_path: ""
+
+# The file path of client.key. The config only works when opening the TLS
switch.
+client_key_path: ""
+
+# The file path oca.pem. The config only works when opening the TLS switch.
+ca_pem_path: ""
+
+# 0 means NoResponse, 1 means WaitForLocal and -1 means WaitForAll (default 1).
+required_acks: 1
+
+# The producer max retry times (default 3).
+producer_max_retry: 3
+
+# The meta max retry times (default 3).
+meta_max_retry: 3
+
+# How long to wait for the cluster to settle between retries (default 100ms).
Time unit is ms.
+retry_backoff: 100
+
+# The max message bytes.
+max_message_bytes: 1000000
+
+# If enabled, the producer will ensure that exactly one copy of each message
is written (default false).
+idempotent_writes: false
+
+# A user-provided string sent with every request to the brokers for logging,
debugging, and auditing purposes (default Satellite).
+client_id: Satellite
+
+# Compression codec represents the various compression codecs recognized by
Kafka in messages. 0 : None, 1 : Gzip, 2 : Snappy, 3 : LZ4, 4 : ZSTD
+compression_codec: 0
+
+# How frequently to refresh the cluster metadata in the background. Defaults
to 10 minutes. The unit is minute.
+# refresh_period: 10
+
+# InsecureSkipVerify controls whether a client verifies the server's
certificate chain and host name.
+insecure_skip_verify: true
+```
+# api.Fallbacker
+## timer-fallbacker
+### description
+```this is a timer fallback trigger when forward fails.```
+### defaultConfig
+```
+max_times: 3
+latency_factor: 2000
+```
+# api.Forwarder
+## log-kafka-forwarder
+### description
+```this is a synchronization Kafka log forwarder.```
+### defaultConfig
+```
+# The remote topic.
+topic: "log-topic"
+```
+# api.Queue
+## mmap-queue
+### description
+```this is a memory mapped queue to provide the persistent storage.```
+### defaultConfig
+```
+# The size of each segment. Default value is 128K. The unit is Byte.
+segment_size: 131072
+# The max num of segments in memory. Default value is 10.
+max_in_mem_segments: 10
+# The capacity of Queue = segment_size * queue_capacity_segments.
+queue_capacity_segments: 4000
+# The period flush time. The unit is ms. Default value is 1 second.
+flush_period: 1000
+# The max number in one flush time. Default value is 10000.
+flush_ceiling_num: 10000
+# Contains all files in the queue.
+queue_dir: satellite-mmap-queue
+# The max size of the input event. Default value is 20k.
+max_event_size: 20480
+```
+# api.Server
+## prometheus-server
+### description
+```this is a prometheus server to export the metrics in Satellite.```
+### defaultConfig
+```
+# The prometheus server address.
+address: ":9299"
+# The prometheus server metrics endpoint.
+endpoint: "/metrics"
+```
diff --git a/internal/pkg/plugin/registry.go b/internal/pkg/plugin/registry.go
index edd6d11..cd6ffc9 100644
--- a/internal/pkg/plugin/registry.go
+++ b/internal/pkg/plugin/registry.go
@@ -30,16 +30,16 @@ import (
// the global plugin registry
var (
- reg map[reflect.Type]map[string]reflect.Value
+ Reg map[reflect.Type]map[string]reflect.Value
)
func init() {
- reg = make(map[reflect.Type]map[string]reflect.Value)
+ Reg = make(map[reflect.Type]map[string]reflect.Value)
}
// RegisterPluginCategory register the RegInfo to the global type registry.
func RegisterPluginCategory(pluginType reflect.Type) {
- reg[pluginType] = map[string]reflect.Value{}
+ Reg[pluginType] = map[string]reflect.Value{}
}
// RegisterPlugin registers the pluginType as plugin.
@@ -47,7 +47,7 @@ func RegisterPluginCategory(pluginType reflect.Type) {
func RegisterPlugin(plugin Plugin) {
v := reflect.ValueOf(plugin)
success := false
- for pCategory, pReg := range reg {
+ for pCategory, pReg := range Reg {
if v.Type().Implements(pCategory) {
pReg[plugin.Name()] = v
log.Logger.Infof("register %s %s successfully",
plugin.Name(), v.Type().String())
@@ -62,7 +62,7 @@ func RegisterPlugin(plugin Plugin) {
// Get an initialized specific plugin according to the pluginCategory and
config.
func Get(category reflect.Type, cfg Config) Plugin {
pluginName := nameFinder(cfg)
- value, ok := reg[category][pluginName]
+ value, ok := Reg[category][pluginName]
if !ok {
panic(fmt.Errorf("cannot find %s plugin, and the category of
plugin is %s", pluginName, category))
}
diff --git a/internal/satellite/tools/generate_plugin_doc.go
b/internal/satellite/tools/generate_plugin_doc.go
new file mode 100644
index 0000000..14ca5ad
--- /dev/null
+++ b/internal/satellite/tools/generate_plugin_doc.go
@@ -0,0 +1,89 @@
+// Licensed to Apache Software Foundation (ASF) under one or more contributor
+// license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright
+// ownership. Apache Software Foundation (ASF) licenses this file to you under
+// the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// 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 tools
+
+import (
+ "fmt"
+ "io/ioutil"
+ "os"
+ "reflect"
+ "sort"
+ "strings"
+
+ "github.com/apache/skywalking-satellite/internal/pkg/log"
+ "github.com/apache/skywalking-satellite/internal/pkg/plugin"
+ "github.com/apache/skywalking-satellite/plugins"
+)
+
+const (
+ docDir = "docs"
+ docPath = docDir + "/plugin-description.md"
+ topLevel = "# "
+ SecondLevel = "## "
+ thirdLevel = "### "
+ LF = "\n"
+ codeQuote = "```"
+ descStr = "description"
+ confStr = "defaultConfig"
+)
+
+func GeneratePluginDoc() error {
+ log.Init(&log.LoggerConfig{})
+ plugins.RegisterPlugins()
+ // the generated doc content
+ var doc string
+ // sort categories by dictionary sequence
+ var categories []reflect.Type
+ for c := range plugin.Reg {
+ categories = append(categories, c)
+ }
+ sort.Slice(categories, func(i, j int) bool {
+ return strings.Compare(categories[i].String(),
categories[j].String()) <= 0
+ })
+ for _, category := range categories {
+ mapping := plugin.Reg[category]
+ var keys []string
+ for k := range mapping {
+ keys = append(keys, k)
+ }
+ sort.Strings(keys)
+ for _, key := range keys {
+ p := plugin.Get(category,
plugin.Config{plugin.NameField: key})
+ doc += topLevel + category.String() + LF
+ doc += SecondLevel + key + LF
+ doc += thirdLevel + descStr + LF + codeQuote +
p.Description() + codeQuote + LF
+ doc += thirdLevel + confStr + LF + codeQuote +
p.DefaultConfig() + codeQuote + LF
+ }
+ }
+ if err := createDir(docDir); err != nil {
+ return fmt.Errorf("create docs dir error: %v", err)
+ }
+ if err := ioutil.WriteFile(docPath, []byte(doc), os.ModePerm); err !=
nil {
+ return fmt.Errorf("cannot init the plugin doc: %v", err)
+ }
+ log.Logger.Info("Successfully generate documentation!")
+ return nil
+}
+
+func createDir(path string) error {
+ fileInfo, err := os.Stat(path)
+ if os.IsNotExist(err) || fileInfo.Size() == 0 {
+ return os.Mkdir(docDir, os.ModePerm)
+ }
+ return err
+}
diff --git a/plugins/fallbacker/timer/timer_fallbacker.go
b/plugins/fallbacker/timer/timer_fallbacker.go
index 8398098..324f4b0 100644
--- a/plugins/fallbacker/timer/timer_fallbacker.go
+++ b/plugins/fallbacker/timer/timer_fallbacker.go
@@ -38,7 +38,7 @@ func (t *Fallbacker) Name() string {
}
func (t *Fallbacker) Description() string {
- return "this is a timer trigger when forward fails."
+ return "this is a timer fallback trigger when forward fails."
}
func (t *Fallbacker) DefaultConfig() string {
diff --git a/plugins/queue/mmap/queue.go b/plugins/queue/mmap/queue.go
index 98f85c7..22b76b0 100644
--- a/plugins/queue/mmap/queue.go
+++ b/plugins/queue/mmap/queue.go
@@ -79,7 +79,7 @@ func (q *Queue) Name() string {
}
func (q *Queue) Description() string {
- return "this is a mmap queue"
+ return "this is a memory mapped queue to provide the persistent
storage."
}
func (q *Queue) DefaultConfig() string {