commit
c725b4c797
@ -8,8 +8,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/bwmarrin/discordgo"
|
"github.com/bwmarrin/discordgo"
|
||||||
"github.com/micro/cli"
|
|
||||||
"github.com/micro/go-micro/agent/input"
|
"github.com/micro/go-micro/agent/input"
|
||||||
|
"github.com/micro/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@ -36,20 +36,20 @@ type discordInput struct {
|
|||||||
|
|
||||||
func (d *discordInput) Flags() []cli.Flag {
|
func (d *discordInput) Flags() []cli.Flag {
|
||||||
return []cli.Flag{
|
return []cli.Flag{
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "discord_token",
|
Name: "discord_token",
|
||||||
EnvVar: "MICRO_DISCORD_TOKEN",
|
EnvVars: []string{"MICRO_DISCORD_TOKEN"},
|
||||||
Usage: "Discord token (prefix with Bot if it's for bot account)",
|
Usage: "Discord token (prefix with Bot if it's for bot account)",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "discord_whitelist",
|
Name: "discord_whitelist",
|
||||||
EnvVar: "MICRO_DISCORD_WHITELIST",
|
EnvVars: []string{"MICRO_DISCORD_WHITELIST"},
|
||||||
Usage: "Discord Whitelist (seperated by ,)",
|
Usage: "Discord Whitelist (seperated by ,)",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "discord_prefix",
|
Name: "discord_prefix",
|
||||||
Usage: "Discord Prefix",
|
Usage: "Discord Prefix",
|
||||||
EnvVar: "MICRO_DISCORD_PREFIX",
|
EnvVars: []string{"MICRO_DISCORD_PREFIX"},
|
||||||
Value: "Micro ",
|
Value: "Micro ",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
package input
|
package input
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/micro/cli"
|
"github.com/micro/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
type EventType string
|
type EventType string
|
||||||
|
@ -4,9 +4,9 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/micro/cli"
|
|
||||||
"github.com/micro/go-micro/agent/input"
|
"github.com/micro/go-micro/agent/input"
|
||||||
"github.com/nlopes/slack"
|
"github.com/nlopes/slack"
|
||||||
|
"github.com/micro/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
type slackInput struct {
|
type slackInput struct {
|
||||||
@ -26,15 +26,15 @@ func init() {
|
|||||||
|
|
||||||
func (p *slackInput) Flags() []cli.Flag {
|
func (p *slackInput) Flags() []cli.Flag {
|
||||||
return []cli.Flag{
|
return []cli.Flag{
|
||||||
cli.BoolFlag{
|
&cli.BoolFlag{
|
||||||
Name: "slack_debug",
|
Name: "slack_debug",
|
||||||
Usage: "Slack debug output",
|
Usage: "Slack debug output",
|
||||||
EnvVar: "MICRO_SLACK_DEBUG",
|
EnvVars: []string{"MICRO_SLACK_DEBUG"},
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "slack_token",
|
Name: "slack_token",
|
||||||
Usage: "Slack token",
|
Usage: "Slack token",
|
||||||
EnvVar: "MICRO_SLACK_TOKEN",
|
EnvVars: []string{"MICRO_SLACK_TOKEN"},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/micro/cli"
|
|
||||||
"github.com/micro/go-micro/agent/input"
|
"github.com/micro/go-micro/agent/input"
|
||||||
|
"github.com/micro/cli/v2"
|
||||||
tgbotapi "gopkg.in/telegram-bot-api.v4"
|
tgbotapi "gopkg.in/telegram-bot-api.v4"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -34,19 +34,19 @@ func init() {
|
|||||||
|
|
||||||
func (ti *telegramInput) Flags() []cli.Flag {
|
func (ti *telegramInput) Flags() []cli.Flag {
|
||||||
return []cli.Flag{
|
return []cli.Flag{
|
||||||
cli.BoolFlag{
|
&cli.BoolFlag{
|
||||||
Name: "telegram_debug",
|
Name: "telegram_debug",
|
||||||
EnvVar: "MICRO_TELEGRAM_DEBUG",
|
EnvVars: []string{"MICRO_TELEGRAM_DEBUG"},
|
||||||
Usage: "Telegram debug output",
|
Usage: "Telegram debug output",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "telegram_token",
|
Name: "telegram_token",
|
||||||
EnvVar: "MICRO_TELEGRAM_TOKEN",
|
EnvVars: []string{"MICRO_TELEGRAM_TOKEN"},
|
||||||
Usage: "Telegram token",
|
Usage: "Telegram token",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "telegram_whitelist",
|
Name: "telegram_whitelist",
|
||||||
EnvVar: "MICRO_TELEGRAM_WHITELIST",
|
EnvVars: []string{"MICRO_TELEGRAM_WHITELIST"},
|
||||||
Usage: "Telegram bot's users (comma-separated values)",
|
Usage: "Telegram bot's users (comma-separated values)",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -46,10 +46,6 @@ type PublishOption func(*PublishOptions)
|
|||||||
|
|
||||||
type SubscribeOption func(*SubscribeOptions)
|
type SubscribeOption func(*SubscribeOptions)
|
||||||
|
|
||||||
var (
|
|
||||||
registryKey = "github.com/micro/go-micro/registry"
|
|
||||||
)
|
|
||||||
|
|
||||||
func NewSubscribeOptions(opts ...SubscribeOption) SubscribeOptions {
|
func NewSubscribeOptions(opts ...SubscribeOption) SubscribeOptions {
|
||||||
opt := SubscribeOptions{
|
opt := SubscribeOptions{
|
||||||
AutoAck: true,
|
AutoAck: true,
|
||||||
|
@ -10,7 +10,6 @@ import (
|
|||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/micro/go-micro/broker"
|
"github.com/micro/go-micro/broker"
|
||||||
"github.com/micro/go-micro/util/pool"
|
|
||||||
"github.com/micro/go-micro/client/selector"
|
"github.com/micro/go-micro/client/selector"
|
||||||
"github.com/micro/go-micro/codec"
|
"github.com/micro/go-micro/codec"
|
||||||
raw "github.com/micro/go-micro/codec/bytes"
|
raw "github.com/micro/go-micro/codec/bytes"
|
||||||
@ -19,6 +18,7 @@ import (
|
|||||||
"github.com/micro/go-micro/registry"
|
"github.com/micro/go-micro/registry"
|
||||||
"github.com/micro/go-micro/transport"
|
"github.com/micro/go-micro/transport"
|
||||||
"github.com/micro/go-micro/util/buf"
|
"github.com/micro/go-micro/util/buf"
|
||||||
|
"github.com/micro/go-micro/util/pool"
|
||||||
)
|
)
|
||||||
|
|
||||||
type rpcClient struct {
|
type rpcClient struct {
|
||||||
|
@ -7,7 +7,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/micro/cli"
|
|
||||||
"github.com/micro/go-micro/broker"
|
"github.com/micro/go-micro/broker"
|
||||||
"github.com/micro/go-micro/client"
|
"github.com/micro/go-micro/client"
|
||||||
"github.com/micro/go-micro/client/selector"
|
"github.com/micro/go-micro/client/selector"
|
||||||
@ -25,6 +24,7 @@ import (
|
|||||||
// servers
|
// servers
|
||||||
sgrpc "github.com/micro/go-micro/server/grpc"
|
sgrpc "github.com/micro/go-micro/server/grpc"
|
||||||
smucp "github.com/micro/go-micro/server/mucp"
|
smucp "github.com/micro/go-micro/server/mucp"
|
||||||
|
"github.com/micro/cli/v2"
|
||||||
|
|
||||||
// brokers
|
// brokers
|
||||||
"github.com/micro/go-micro/broker/memory"
|
"github.com/micro/go-micro/broker/memory"
|
||||||
@ -73,139 +73,139 @@ var (
|
|||||||
DefaultCmd = newCmd()
|
DefaultCmd = newCmd()
|
||||||
|
|
||||||
DefaultFlags = []cli.Flag{
|
DefaultFlags = []cli.Flag{
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "client",
|
Name: "client",
|
||||||
EnvVar: "MICRO_CLIENT",
|
EnvVars: []string{"MICRO_CLIENT"},
|
||||||
Usage: "Client for go-micro; rpc",
|
Usage: "Client for go-micro; rpc",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "client_request_timeout",
|
Name: "client_request_timeout",
|
||||||
EnvVar: "MICRO_CLIENT_REQUEST_TIMEOUT",
|
EnvVars: []string{"MICRO_CLIENT_REQUEST_TIMEOUT"},
|
||||||
Usage: "Sets the client request timeout. e.g 500ms, 5s, 1m. Default: 5s",
|
Usage: "Sets the client request timeout. e.g 500ms, 5s, 1m. Default: 5s",
|
||||||
},
|
},
|
||||||
cli.IntFlag{
|
&cli.IntFlag{
|
||||||
Name: "client_retries",
|
Name: "client_retries",
|
||||||
EnvVar: "MICRO_CLIENT_RETRIES",
|
EnvVars: []string{"MICRO_CLIENT_RETRIES"},
|
||||||
Value: client.DefaultRetries,
|
Value: client.DefaultRetries,
|
||||||
Usage: "Sets the client retries. Default: 1",
|
Usage: "Sets the client retries. Default: 1",
|
||||||
},
|
},
|
||||||
cli.IntFlag{
|
&cli.IntFlag{
|
||||||
Name: "client_pool_size",
|
Name: "client_pool_size",
|
||||||
EnvVar: "MICRO_CLIENT_POOL_SIZE",
|
EnvVars: []string{"MICRO_CLIENT_POOL_SIZE"},
|
||||||
Usage: "Sets the client connection pool size. Default: 1",
|
Usage: "Sets the client connection pool size. Default: 1",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "client_pool_ttl",
|
Name: "client_pool_ttl",
|
||||||
EnvVar: "MICRO_CLIENT_POOL_TTL",
|
EnvVars: []string{"MICRO_CLIENT_POOL_TTL"},
|
||||||
Usage: "Sets the client connection pool ttl. e.g 500ms, 5s, 1m. Default: 1m",
|
Usage: "Sets the client connection pool ttl. e.g 500ms, 5s, 1m. Default: 1m",
|
||||||
},
|
},
|
||||||
cli.IntFlag{
|
&cli.IntFlag{
|
||||||
Name: "register_ttl",
|
Name: "register_ttl",
|
||||||
EnvVar: "MICRO_REGISTER_TTL",
|
EnvVars: []string{"MICRO_REGISTER_TTL"},
|
||||||
Value: 60,
|
Value: 60,
|
||||||
Usage: "Register TTL in seconds",
|
Usage: "Register TTL in seconds",
|
||||||
},
|
},
|
||||||
cli.IntFlag{
|
&cli.IntFlag{
|
||||||
Name: "register_interval",
|
Name: "register_interval",
|
||||||
EnvVar: "MICRO_REGISTER_INTERVAL",
|
EnvVars: []string{"MICRO_REGISTER_INTERVAL"},
|
||||||
Value: 30,
|
Value: 30,
|
||||||
Usage: "Register interval in seconds",
|
Usage: "Register interval in seconds",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "server",
|
Name: "server",
|
||||||
EnvVar: "MICRO_SERVER",
|
EnvVars: []string{"MICRO_SERVER"},
|
||||||
Usage: "Server for go-micro; rpc",
|
Usage: "Server for go-micro; rpc",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "server_name",
|
Name: "server_name",
|
||||||
EnvVar: "MICRO_SERVER_NAME",
|
EnvVars: []string{"MICRO_SERVER_NAME"},
|
||||||
Usage: "Name of the server. go.micro.srv.example",
|
Usage: "Name of the server. go.micro.srv.example",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "server_version",
|
Name: "server_version",
|
||||||
EnvVar: "MICRO_SERVER_VERSION",
|
EnvVars: []string{"MICRO_SERVER_VERSION"},
|
||||||
Usage: "Version of the server. 1.1.0",
|
Usage: "Version of the server. 1.1.0",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "server_id",
|
Name: "server_id",
|
||||||
EnvVar: "MICRO_SERVER_ID",
|
EnvVars: []string{"MICRO_SERVER_ID"},
|
||||||
Usage: "Id of the server. Auto-generated if not specified",
|
Usage: "Id of the server. Auto-generated if not specified",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "server_address",
|
Name: "server_address",
|
||||||
EnvVar: "MICRO_SERVER_ADDRESS",
|
EnvVars: []string{"MICRO_SERVER_ADDRESS"},
|
||||||
Usage: "Bind address for the server. 127.0.0.1:8080",
|
Usage: "Bind address for the server. 127.0.0.1:8080",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "server_advertise",
|
Name: "server_advertise",
|
||||||
EnvVar: "MICRO_SERVER_ADVERTISE",
|
EnvVars: []string{"MICRO_SERVER_ADVERTISE"},
|
||||||
Usage: "Used instead of the server_address when registering with discovery. 127.0.0.1:8080",
|
Usage: "Used instead of the server_address when registering with discovery. 127.0.0.1:8080",
|
||||||
},
|
},
|
||||||
cli.StringSliceFlag{
|
&cli.StringSliceFlag{
|
||||||
Name: "server_metadata",
|
Name: "server_metadata",
|
||||||
EnvVar: "MICRO_SERVER_METADATA",
|
EnvVars: []string{"MICRO_SERVER_METADATA"},
|
||||||
Value: &cli.StringSlice{},
|
Value: &cli.StringSlice{},
|
||||||
Usage: "A list of key-value pairs defining metadata. version=1.0.0",
|
Usage: "A list of key-value pairs defining metadata. version=1.0.0",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "broker",
|
Name: "broker",
|
||||||
EnvVar: "MICRO_BROKER",
|
EnvVars: []string{"MICRO_BROKER"},
|
||||||
Usage: "Broker for pub/sub. http, nats, rabbitmq",
|
Usage: "Broker for pub/sub. http, nats, rabbitmq",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "broker_address",
|
Name: "broker_address",
|
||||||
EnvVar: "MICRO_BROKER_ADDRESS",
|
EnvVars: []string{"MICRO_BROKER_ADDRESS"},
|
||||||
Usage: "Comma-separated list of broker addresses",
|
Usage: "Comma-separated list of broker addresses",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "profile",
|
Name: "profile",
|
||||||
Usage: "Debug profiler for cpu and memory stats",
|
Usage: "Debug profiler for cpu and memory stats",
|
||||||
EnvVar: "MICRO_DEBUG_PROFILE",
|
EnvVars: []string{"MICRO_DEBUG_PROFILE"},
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "registry",
|
Name: "registry",
|
||||||
EnvVar: "MICRO_REGISTRY",
|
EnvVars: []string{"MICRO_REGISTRY"},
|
||||||
Usage: "Registry for discovery. etcd, mdns",
|
Usage: "Registry for discovery. etcd, mdns",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "registry_address",
|
Name: "registry_address",
|
||||||
EnvVar: "MICRO_REGISTRY_ADDRESS",
|
EnvVars: []string{"MICRO_REGISTRY_ADDRESS"},
|
||||||
Usage: "Comma-separated list of registry addresses",
|
Usage: "Comma-separated list of registry addresses",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "runtime",
|
Name: "runtime",
|
||||||
Usage: "Runtime for building and running services e.g local, kubernetes",
|
Usage: "Runtime for building and running services e.g local, kubernetes",
|
||||||
EnvVar: "MICRO_RUNTIME",
|
EnvVars: []string{"MICRO_RUNTIME"},
|
||||||
Value: "local",
|
Value: "local",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "selector",
|
Name: "selector",
|
||||||
EnvVar: "MICRO_SELECTOR",
|
EnvVars: []string{"MICRO_SELECTOR"},
|
||||||
Usage: "Selector used to pick nodes for querying",
|
Usage: "Selector used to pick nodes for querying",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "store",
|
Name: "store",
|
||||||
EnvVar: "MICRO_STORE",
|
EnvVars: []string{"MICRO_STORE"},
|
||||||
Usage: "Store used for key-value storage",
|
Usage: "Store used for key-value storage",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "store_address",
|
Name: "store_address",
|
||||||
EnvVar: "MICRO_STORE_ADDRESS",
|
EnvVars: []string{"MICRO_STORE_ADDRESS"},
|
||||||
Usage: "Comma-separated list of store addresses",
|
Usage: "Comma-separated list of store addresses",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "store_namespace",
|
Name: "store_namespace",
|
||||||
EnvVar: "MICRO_STORE_NAMESPACE",
|
EnvVars: []string{"MICRO_STORE_NAMESPACE"},
|
||||||
Usage: "Namespace for store data",
|
Usage: "Namespace for store data",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "transport",
|
Name: "transport",
|
||||||
EnvVar: "MICRO_TRANSPORT",
|
EnvVars: []string{"MICRO_TRANSPORT"},
|
||||||
Usage: "Transport mechanism used; http",
|
Usage: "Transport mechanism used; http",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "transport_address",
|
Name: "transport_address",
|
||||||
EnvVar: "MICRO_TRANSPORT_ADDRESS",
|
EnvVars: []string{"MICRO_TRANSPORT_ADDRESS"},
|
||||||
Usage: "Comma-separated list of transport addresses",
|
Usage: "Comma-separated list of transport addresses",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -306,7 +306,9 @@ func newCmd(opts ...Option) Cmd {
|
|||||||
cmd.app.Usage = cmd.opts.Description
|
cmd.app.Usage = cmd.opts.Description
|
||||||
cmd.app.Before = cmd.Before
|
cmd.app.Before = cmd.Before
|
||||||
cmd.app.Flags = DefaultFlags
|
cmd.app.Flags = DefaultFlags
|
||||||
cmd.app.Action = func(c *cli.Context) {}
|
cmd.app.Action = func(c *cli.Context) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
if len(options.Version) == 0 {
|
if len(options.Version) == 0 {
|
||||||
cmd.app.HideVersion = true
|
cmd.app.HideVersion = true
|
||||||
@ -489,11 +491,11 @@ func (c *cmd) Before(ctx *cli.Context) error {
|
|||||||
serverOpts = append(serverOpts, server.Advertise(ctx.String("server_advertise")))
|
serverOpts = append(serverOpts, server.Advertise(ctx.String("server_advertise")))
|
||||||
}
|
}
|
||||||
|
|
||||||
if ttl := time.Duration(ctx.GlobalInt("register_ttl")); ttl >= 0 {
|
if ttl := time.Duration(ctx.Int("register_ttl")); ttl >= 0 {
|
||||||
serverOpts = append(serverOpts, server.RegisterTTL(ttl*time.Second))
|
serverOpts = append(serverOpts, server.RegisterTTL(ttl*time.Second))
|
||||||
}
|
}
|
||||||
|
|
||||||
if val := time.Duration(ctx.GlobalInt("register_interval")); val >= 0 {
|
if val := time.Duration(ctx.Int("register_interval")); val >= 0 {
|
||||||
serverOpts = append(serverOpts, server.RegisterInterval(val*time.Second))
|
serverOpts = append(serverOpts, server.RegisterInterval(val*time.Second))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,9 +8,9 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/imdario/mergo"
|
"github.com/imdario/mergo"
|
||||||
"github.com/micro/cli"
|
|
||||||
"github.com/micro/go-micro/config/cmd"
|
"github.com/micro/go-micro/config/cmd"
|
||||||
"github.com/micro/go-micro/config/source"
|
"github.com/micro/go-micro/config/source"
|
||||||
|
"github.com/micro/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
type cliSource struct {
|
type cliSource struct {
|
||||||
@ -21,11 +21,6 @@ type cliSource struct {
|
|||||||
func (c *cliSource) Read() (*source.ChangeSet, error) {
|
func (c *cliSource) Read() (*source.ChangeSet, error) {
|
||||||
var changes map[string]interface{}
|
var changes map[string]interface{}
|
||||||
|
|
||||||
for _, name := range c.ctx.GlobalFlagNames() {
|
|
||||||
tmp := toEntry(name, c.ctx.GlobalGeneric(name))
|
|
||||||
mergo.Map(&changes, tmp) // need to sort error handling
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, name := range c.ctx.FlagNames() {
|
for _, name := range c.ctx.FlagNames() {
|
||||||
tmp := toEntry(name, c.ctx.Generic(name))
|
tmp := toEntry(name, c.ctx.Generic(name))
|
||||||
mergo.Map(&changes, tmp) // need to sort error handling
|
mergo.Map(&changes, tmp) // need to sort error handling
|
||||||
|
@ -5,9 +5,9 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/micro/cli"
|
|
||||||
"github.com/micro/go-micro/config/cmd"
|
"github.com/micro/go-micro/config/cmd"
|
||||||
"github.com/micro/go-micro/config/source"
|
"github.com/micro/go-micro/config/source"
|
||||||
|
"github.com/micro/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func test(t *testing.T, withContext bool) {
|
func test(t *testing.T, withContext bool) {
|
||||||
@ -17,14 +17,15 @@ func test(t *testing.T, withContext bool) {
|
|||||||
app := cmd.App()
|
app := cmd.App()
|
||||||
app.Name = "testapp"
|
app.Name = "testapp"
|
||||||
app.Flags = []cli.Flag{
|
app.Flags = []cli.Flag{
|
||||||
cli.StringFlag{Name: "db-host"},
|
&cli.StringFlag{Name: "db-host"},
|
||||||
}
|
}
|
||||||
|
|
||||||
// with context
|
// with context
|
||||||
if withContext {
|
if withContext {
|
||||||
// set action
|
// set action
|
||||||
app.Action = func(c *cli.Context) {
|
app.Action = func(c *cli.Context) error {
|
||||||
src = WithContext(c)
|
src = WithContext(c)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// run app
|
// run app
|
||||||
|
@ -3,7 +3,7 @@ package cli
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/micro/cli"
|
"github.com/micro/cli/v2"
|
||||||
"github.com/micro/go-micro/config/source"
|
"github.com/micro/go-micro/config/source"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ import (
|
|||||||
"flag"
|
"flag"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/micro/cli"
|
"github.com/micro/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) {
|
func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) {
|
||||||
@ -22,7 +22,7 @@ func normalizeFlags(flags []cli.Flag, set *flag.FlagSet) error {
|
|||||||
visited[f.Name] = true
|
visited[f.Name] = true
|
||||||
})
|
})
|
||||||
for _, f := range flags {
|
for _, f := range flags {
|
||||||
parts := strings.Split(f.GetName(), ",")
|
parts := f.Names()
|
||||||
if len(parts) == 1 {
|
if len(parts) == 1 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ import (
|
|||||||
"github.com/micro/go-micro/debug/log"
|
"github.com/micro/go-micro/debug/log"
|
||||||
proto "github.com/micro/go-micro/debug/service/proto"
|
proto "github.com/micro/go-micro/debug/service/proto"
|
||||||
"github.com/micro/go-micro/debug/stats"
|
"github.com/micro/go-micro/debug/stats"
|
||||||
|
"github.com/micro/go-micro/debug/trace"
|
||||||
"github.com/micro/go-micro/server"
|
"github.com/micro/go-micro/server"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -23,12 +24,15 @@ type Debug struct {
|
|||||||
log log.Log
|
log log.Log
|
||||||
// the stats collector
|
// the stats collector
|
||||||
stats stats.Stats
|
stats stats.Stats
|
||||||
|
// the tracer
|
||||||
|
trace trace.Trace
|
||||||
}
|
}
|
||||||
|
|
||||||
func newDebug() *Debug {
|
func newDebug() *Debug {
|
||||||
return &Debug{
|
return &Debug{
|
||||||
log: log.DefaultLog,
|
log: log.DefaultLog,
|
||||||
stats: stats.DefaultStats,
|
stats: stats.DefaultStats,
|
||||||
|
trace: trace.DefaultTrace,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,6 +64,27 @@ func (d *Debug) Stats(ctx context.Context, req *proto.StatsRequest, rsp *proto.S
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Debug) Trace(ctx context.Context, req *proto.TraceRequest, rsp *proto.TraceResponse) error {
|
||||||
|
traces, err := d.trace.Read(trace.ReadTrace(req.Id))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, trace := range traces {
|
||||||
|
rsp.Spans = append(rsp.Spans, &proto.Span{
|
||||||
|
Trace: trace.Trace,
|
||||||
|
Id: trace.Id,
|
||||||
|
Parent: trace.Parent,
|
||||||
|
Name: trace.Name,
|
||||||
|
Started: uint64(trace.Started.UnixNano()),
|
||||||
|
Duration: uint64(trace.Duration.Nanoseconds()),
|
||||||
|
Metadata: trace.Metadata,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Debug) Log(ctx context.Context, stream server.Stream) error {
|
func (d *Debug) Log(ctx context.Context, stream server.Stream) error {
|
||||||
req := new(proto.LogRequest)
|
req := new(proto.LogRequest)
|
||||||
if err := stream.Recv(req); err != nil {
|
if err := stream.Recv(req); err != nil {
|
||||||
|
@ -372,6 +372,179 @@ func (m *Record) GetMessage() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type TraceRequest struct {
|
||||||
|
// trace id to retrieve
|
||||||
|
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *TraceRequest) Reset() { *m = TraceRequest{} }
|
||||||
|
func (m *TraceRequest) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*TraceRequest) ProtoMessage() {}
|
||||||
|
func (*TraceRequest) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_dea322649cde1ef2, []int{6}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *TraceRequest) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_TraceRequest.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *TraceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_TraceRequest.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *TraceRequest) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_TraceRequest.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *TraceRequest) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_TraceRequest.Size(m)
|
||||||
|
}
|
||||||
|
func (m *TraceRequest) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_TraceRequest.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_TraceRequest proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func (m *TraceRequest) GetId() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Id
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type TraceResponse struct {
|
||||||
|
Spans []*Span `protobuf:"bytes,1,rep,name=spans,proto3" json:"spans,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *TraceResponse) Reset() { *m = TraceResponse{} }
|
||||||
|
func (m *TraceResponse) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*TraceResponse) ProtoMessage() {}
|
||||||
|
func (*TraceResponse) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_dea322649cde1ef2, []int{7}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *TraceResponse) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_TraceResponse.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *TraceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_TraceResponse.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *TraceResponse) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_TraceResponse.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *TraceResponse) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_TraceResponse.Size(m)
|
||||||
|
}
|
||||||
|
func (m *TraceResponse) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_TraceResponse.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_TraceResponse proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func (m *TraceResponse) GetSpans() []*Span {
|
||||||
|
if m != nil {
|
||||||
|
return m.Spans
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type Span struct {
|
||||||
|
// the trace id
|
||||||
|
Trace string `protobuf:"bytes,1,opt,name=trace,proto3" json:"trace,omitempty"`
|
||||||
|
// id of the span
|
||||||
|
Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
|
||||||
|
// parent span
|
||||||
|
Parent string `protobuf:"bytes,3,opt,name=parent,proto3" json:"parent,omitempty"`
|
||||||
|
// name of the resource
|
||||||
|
Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
|
||||||
|
// time of start in nanoseconds
|
||||||
|
Started uint64 `protobuf:"varint,5,opt,name=started,proto3" json:"started,omitempty"`
|
||||||
|
// duration of the execution in nanoseconds
|
||||||
|
Duration uint64 `protobuf:"varint,6,opt,name=duration,proto3" json:"duration,omitempty"`
|
||||||
|
// associated metadata
|
||||||
|
Metadata map[string]string `protobuf:"bytes,7,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Span) Reset() { *m = Span{} }
|
||||||
|
func (m *Span) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*Span) ProtoMessage() {}
|
||||||
|
func (*Span) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_dea322649cde1ef2, []int{8}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Span) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_Span.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *Span) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_Span.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *Span) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_Span.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *Span) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_Span.Size(m)
|
||||||
|
}
|
||||||
|
func (m *Span) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_Span.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_Span proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func (m *Span) GetTrace() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Trace
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Span) GetId() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Id
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Span) GetParent() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Parent
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Span) GetName() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Name
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Span) GetStarted() uint64 {
|
||||||
|
if m != nil {
|
||||||
|
return m.Started
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Span) GetDuration() uint64 {
|
||||||
|
if m != nil {
|
||||||
|
return m.Duration
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Span) GetMetadata() map[string]string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Metadata
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
proto.RegisterType((*HealthRequest)(nil), "HealthRequest")
|
proto.RegisterType((*HealthRequest)(nil), "HealthRequest")
|
||||||
proto.RegisterType((*HealthResponse)(nil), "HealthResponse")
|
proto.RegisterType((*HealthResponse)(nil), "HealthResponse")
|
||||||
@ -380,6 +553,10 @@ func init() {
|
|||||||
proto.RegisterType((*LogRequest)(nil), "LogRequest")
|
proto.RegisterType((*LogRequest)(nil), "LogRequest")
|
||||||
proto.RegisterType((*Record)(nil), "Record")
|
proto.RegisterType((*Record)(nil), "Record")
|
||||||
proto.RegisterMapType((map[string]string)(nil), "Record.MetadataEntry")
|
proto.RegisterMapType((map[string]string)(nil), "Record.MetadataEntry")
|
||||||
|
proto.RegisterType((*TraceRequest)(nil), "TraceRequest")
|
||||||
|
proto.RegisterType((*TraceResponse)(nil), "TraceResponse")
|
||||||
|
proto.RegisterType((*Span)(nil), "Span")
|
||||||
|
proto.RegisterMapType((map[string]string)(nil), "Span.MetadataEntry")
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@ -387,32 +564,40 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var fileDescriptor_dea322649cde1ef2 = []byte{
|
var fileDescriptor_dea322649cde1ef2 = []byte{
|
||||||
// 427 bytes of a gzipped FileDescriptorProto
|
// 554 bytes of a gzipped FileDescriptorProto
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xcd, 0x6e, 0x13, 0x31,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0xcd, 0x6e, 0xd4, 0x30,
|
||||||
0x14, 0x85, 0x33, 0x33, 0xcd, 0x24, 0xb9, 0x25, 0x01, 0x59, 0x80, 0xac, 0x11, 0x12, 0x95, 0x57,
|
0x10, 0xde, 0x24, 0x9b, 0xdd, 0xcd, 0xb4, 0x09, 0xc8, 0xfc, 0x28, 0x0a, 0x08, 0x2a, 0x9f, 0x16,
|
||||||
0x83, 0x10, 0x0e, 0x94, 0x0d, 0x82, 0x2d, 0x48, 0x2c, 0xca, 0xc6, 0x3c, 0x81, 0x3b, 0x73, 0x35,
|
0x01, 0x5e, 0x28, 0x17, 0x04, 0x57, 0x90, 0x38, 0x94, 0x8b, 0xcb, 0x0b, 0xb8, 0x89, 0x95, 0x06,
|
||||||
0x0d, 0xd4, 0x71, 0xb0, 0xef, 0x54, 0xca, 0x8a, 0x57, 0xe2, 0x65, 0x78, 0x1f, 0xe4, 0x9f, 0xb4,
|
0x9a, 0x38, 0xd8, 0x4e, 0xa5, 0x7d, 0x24, 0x6e, 0xbc, 0x0c, 0x6f, 0xc3, 0x01, 0xf9, 0x27, 0xdb,
|
||||||
0x8d, 0x58, 0x74, 0xe7, 0xef, 0xcc, 0xf5, 0x91, 0xcf, 0x9d, 0x03, 0xd2, 0x6c, 0x3a, 0x67, 0xd7,
|
0x44, 0x08, 0xf5, 0xc0, 0xcd, 0xdf, 0xe7, 0x99, 0x2f, 0x33, 0x9f, 0x67, 0x02, 0xa4, 0x6d, 0x4a,
|
||||||
0x83, 0x7d, 0x93, 0x0e, 0x3d, 0x5e, 0x8e, 0xc3, 0xda, 0xa3, 0xbb, 0xd9, 0x74, 0xb8, 0xde, 0x39,
|
0x29, 0x76, 0xb5, 0x78, 0xe9, 0x0e, 0x15, 0xbf, 0x18, 0xea, 0x9d, 0xe2, 0xf2, 0xba, 0x29, 0xf9,
|
||||||
0x4b, 0x59, 0x93, 0xf1, 0x2c, 0x5e, 0xc1, 0xf2, 0x2b, 0xea, 0x6b, 0xba, 0x52, 0xf8, 0x6b, 0x44,
|
0xae, 0x97, 0x42, 0x7b, 0x8e, 0xd8, 0x33, 0x7e, 0x06, 0xe9, 0x27, 0xce, 0xae, 0xf4, 0x25, 0xe5,
|
||||||
0x4f, 0x8c, 0xc3, 0x2c, 0x4f, 0xf3, 0xe2, 0xac, 0x68, 0x17, 0xea, 0x80, 0xa2, 0x85, 0xd5, 0x61,
|
0xdf, 0x07, 0xae, 0x34, 0xca, 0x61, 0xed, 0xa3, 0xf3, 0xe0, 0x24, 0xd8, 0x26, 0x74, 0x84, 0x78,
|
||||||
0xd4, 0xef, 0xec, 0xd6, 0x23, 0x7b, 0x0e, 0xb5, 0x27, 0x4d, 0xa3, 0xcf, 0xa3, 0x99, 0x44, 0x0b,
|
0x0b, 0xd9, 0x18, 0xaa, 0x7a, 0xd1, 0x29, 0x8e, 0x1e, 0xc2, 0x4a, 0x69, 0xa6, 0x07, 0xe5, 0x43,
|
||||||
0x8f, 0xbe, 0x93, 0x26, 0xff, 0xb0, 0xe7, 0xdf, 0x02, 0x96, 0x79, 0x34, 0x7b, 0xbe, 0x80, 0x05,
|
0x3d, 0xc2, 0x5b, 0x38, 0x3e, 0xd7, 0x4c, 0xab, 0xdb, 0x35, 0x7f, 0x05, 0x90, 0xfa, 0x50, 0xaf,
|
||||||
0x6d, 0x0c, 0x7a, 0xd2, 0x66, 0x17, 0xa7, 0x4f, 0xd4, 0x9d, 0x10, 0x9d, 0x48, 0x3b, 0xc2, 0x9e,
|
0xf9, 0x18, 0x12, 0xdd, 0xb4, 0x5c, 0x69, 0xd6, 0xf6, 0x36, 0x7a, 0x49, 0x6f, 0x08, 0xab, 0xa4,
|
||||||
0x97, 0xf1, 0xdb, 0x01, 0xc3, 0x5b, 0xc6, 0x5d, 0x18, 0xe4, 0x55, 0xfc, 0x90, 0x29, 0xe8, 0x06,
|
0x99, 0xd4, 0xbc, 0xca, 0x43, 0x7b, 0x37, 0x42, 0x53, 0xcb, 0xd0, 0x9b, 0xc0, 0x3c, 0xb2, 0x17,
|
||||||
0x8d, 0x75, 0x7b, 0x7e, 0x92, 0xf4, 0x44, 0xc1, 0x89, 0xae, 0x1c, 0xea, 0xde, 0xf3, 0x69, 0x72,
|
0x1e, 0x19, 0xbe, 0xe5, 0xad, 0x90, 0xfb, 0x7c, 0xe9, 0x78, 0x87, 0x8c, 0x92, 0xbe, 0x94, 0x9c,
|
||||||
0xca, 0xc8, 0x56, 0x50, 0x0e, 0x1d, 0xaf, 0xa3, 0x58, 0x0e, 0x1d, 0x6b, 0x60, 0xee, 0x52, 0x10,
|
0x55, 0x2a, 0x8f, 0x9d, 0x92, 0x87, 0x28, 0x83, 0xb0, 0x2e, 0xf3, 0x95, 0x25, 0xc3, 0xba, 0x44,
|
||||||
0xcf, 0x67, 0x51, 0xbd, 0xe5, 0xe0, 0x8e, 0xce, 0x59, 0xe7, 0xf9, 0x3c, 0xb9, 0x27, 0x12, 0x3f,
|
0x05, 0x6c, 0xa4, 0x6b, 0x44, 0xe5, 0x6b, 0xcb, 0x1e, 0xb0, 0x51, 0xe7, 0x52, 0x0a, 0xa9, 0xf2,
|
||||||
0x00, 0x2e, 0xec, 0xf0, 0x60, 0xfe, 0xb4, 0x41, 0x87, 0xda, 0xc4, 0x38, 0x73, 0x95, 0x89, 0x3d,
|
0x8d, 0x53, 0x77, 0x08, 0x7f, 0x05, 0x38, 0x13, 0xf5, 0xad, 0xfd, 0x3b, 0x07, 0x25, 0x67, 0xad,
|
||||||
0x85, 0x69, 0x67, 0xc7, 0x2d, 0xc5, 0x30, 0x95, 0x4a, 0x10, 0x54, 0xbf, 0xd9, 0x76, 0x18, 0xa3,
|
0x6d, 0x67, 0x43, 0x3d, 0x42, 0xf7, 0x21, 0x2e, 0xc5, 0xd0, 0x69, 0xdb, 0x4c, 0x44, 0x1d, 0x30,
|
||||||
0x54, 0x2a, 0x81, 0xf8, 0x53, 0x40, 0xad, 0xb0, 0xb3, 0xae, 0xff, 0x7f, 0x79, 0xd5, 0xfd, 0xe5,
|
0xac, 0x6a, 0xba, 0x92, 0xdb, 0x56, 0x22, 0xea, 0x00, 0xfe, 0x19, 0xc0, 0x8a, 0xf2, 0x52, 0xc8,
|
||||||
0xbd, 0x83, 0xb9, 0x41, 0xd2, 0xbd, 0x26, 0xcd, 0xcb, 0xb3, 0xaa, 0x3d, 0x3d, 0x7f, 0x26, 0xd3,
|
0xea, 0x6f, 0xf3, 0xa2, 0xa9, 0x79, 0xaf, 0x61, 0xd3, 0x72, 0xcd, 0x2a, 0xa6, 0x59, 0x1e, 0x9e,
|
||||||
0x45, 0xf9, 0x2d, 0xeb, 0x5f, 0xb6, 0xe4, 0xf6, 0xea, 0x76, 0x2c, 0xbc, 0xdc, 0xa0, 0xf7, 0x7a,
|
0x44, 0xdb, 0xa3, 0xd3, 0x07, 0xc4, 0x25, 0x92, 0xcf, 0x9e, 0xff, 0xd8, 0x69, 0xb9, 0xa7, 0x87,
|
||||||
0x48, 0x6b, 0x5d, 0xa8, 0x03, 0x36, 0x9f, 0x60, 0x79, 0x74, 0x89, 0x3d, 0x81, 0xea, 0x27, 0xee,
|
0x30, 0x53, 0x79, 0xcb, 0x95, 0x62, 0xb5, 0xb3, 0x35, 0xa1, 0x23, 0x2c, 0xde, 0x43, 0x3a, 0x4b,
|
||||||
0x73, 0xc0, 0x70, 0x0c, 0xcf, 0xbd, 0xd1, 0xd7, 0x23, 0xc6, 0x6c, 0x0b, 0x95, 0xe0, 0x63, 0xf9,
|
0x42, 0x77, 0x21, 0xfa, 0xc6, 0xf7, 0xbe, 0x41, 0x73, 0x34, 0xe5, 0x5e, 0xb3, 0xab, 0x81, 0xdb,
|
||||||
0xa1, 0x38, 0xff, 0x0d, 0xd3, 0xcf, 0xa1, 0x84, 0xec, 0x35, 0xd4, 0xa9, 0x53, 0x6c, 0x25, 0x8f,
|
0xde, 0x12, 0xea, 0xc0, 0xbb, 0xf0, 0x6d, 0x80, 0x9f, 0xc0, 0xf1, 0x17, 0xc9, 0x4a, 0x3e, 0x1a,
|
||||||
0x7a, 0xd8, 0x3c, 0x96, 0xc7, 0x65, 0x13, 0x13, 0xd6, 0xc2, 0x34, 0x76, 0x85, 0x2d, 0xe5, 0xfd,
|
0x94, 0x41, 0xd8, 0x54, 0x3e, 0x35, 0x6c, 0x2a, 0xfc, 0x02, 0x52, 0x7f, 0xef, 0xa7, 0xe2, 0x11,
|
||||||
0x7a, 0x35, 0x2b, 0x79, 0x54, 0x21, 0x31, 0x61, 0x2f, 0xa1, 0xba, 0xb0, 0x03, 0x3b, 0x95, 0x77,
|
0xc4, 0xaa, 0x67, 0x9d, 0x19, 0x34, 0x53, 0x77, 0x4c, 0xce, 0x7b, 0xd6, 0x51, 0xc7, 0xe1, 0xdf,
|
||||||
0x3f, 0xa1, 0x99, 0xe5, 0xac, 0x62, 0xf2, 0xb6, 0xb8, 0xac, 0x63, 0xfb, 0xdf, 0xff, 0x0b, 0x00,
|
0x01, 0x2c, 0x0d, 0x36, 0x1f, 0xd4, 0x26, 0xcd, 0x2b, 0x39, 0xe0, 0xc5, 0xc3, 0x51, 0xdc, 0x78,
|
||||||
0x00, 0xff, 0xff, 0x69, 0xc0, 0x33, 0x21, 0x2f, 0x03, 0x00, 0x00,
|
0xde, 0x33, 0xc9, 0xbd, 0xb9, 0x09, 0xf5, 0x08, 0x21, 0x58, 0x76, 0xac, 0x75, 0xe6, 0x26, 0xd4,
|
||||||
|
0x9e, 0xa7, 0xf3, 0x16, 0xcf, 0xe7, 0xad, 0x80, 0x4d, 0x35, 0x48, 0xa6, 0x1b, 0xd1, 0xf9, 0x59,
|
||||||
|
0x39, 0x60, 0xb4, 0x9b, 0x18, 0xbd, 0xb6, 0x05, 0xdf, 0xb3, 0x05, 0xff, 0xcb, 0xe6, 0xff, 0x32,
|
||||||
|
0xf3, 0xf4, 0x47, 0x00, 0xf1, 0x07, 0xb3, 0xd2, 0xe8, 0x39, 0xac, 0xdc, 0x86, 0xa2, 0x8c, 0xcc,
|
||||||
|
0xb6, 0xba, 0xb8, 0x43, 0xe6, 0xab, 0x8b, 0x17, 0x68, 0x0b, 0xb1, 0xdd, 0x3c, 0x94, 0x92, 0xe9,
|
||||||
|
0xb2, 0x16, 0x19, 0x99, 0x2d, 0x24, 0x5e, 0xa0, 0xa7, 0x10, 0x9d, 0x89, 0x1a, 0x1d, 0x91, 0x9b,
|
||||||
|
0x91, 0x2e, 0xd6, 0x7e, 0x72, 0xf0, 0xe2, 0x55, 0x60, 0xa4, 0xec, 0x73, 0xa1, 0x94, 0x4c, 0x9f,
|
||||||
|
0xb5, 0xc8, 0xc8, 0xec, 0x15, 0xf1, 0xe2, 0x62, 0x65, 0xff, 0x3a, 0x6f, 0xfe, 0x04, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x02, 0xa2, 0x4d, 0xc9, 0xa7, 0x04, 0x00, 0x00,
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,7 @@ type DebugService interface {
|
|||||||
Health(ctx context.Context, in *HealthRequest, opts ...client.CallOption) (*HealthResponse, error)
|
Health(ctx context.Context, in *HealthRequest, opts ...client.CallOption) (*HealthResponse, error)
|
||||||
Stats(ctx context.Context, in *StatsRequest, opts ...client.CallOption) (*StatsResponse, error)
|
Stats(ctx context.Context, in *StatsRequest, opts ...client.CallOption) (*StatsResponse, error)
|
||||||
Log(ctx context.Context, in *LogRequest, opts ...client.CallOption) (Debug_LogService, error)
|
Log(ctx context.Context, in *LogRequest, opts ...client.CallOption) (Debug_LogService, error)
|
||||||
|
Trace(ctx context.Context, in *TraceRequest, opts ...client.CallOption) (*TraceResponse, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type debugService struct {
|
type debugService struct {
|
||||||
@ -121,12 +122,23 @@ func (x *debugServiceLog) Recv() (*Record, error) {
|
|||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *debugService) Trace(ctx context.Context, in *TraceRequest, opts ...client.CallOption) (*TraceResponse, error) {
|
||||||
|
req := c.c.NewRequest(c.name, "Debug.Trace", in)
|
||||||
|
out := new(TraceResponse)
|
||||||
|
err := c.c.Call(ctx, req, out, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Server API for Debug service
|
// Server API for Debug service
|
||||||
|
|
||||||
type DebugHandler interface {
|
type DebugHandler interface {
|
||||||
Health(context.Context, *HealthRequest, *HealthResponse) error
|
Health(context.Context, *HealthRequest, *HealthResponse) error
|
||||||
Stats(context.Context, *StatsRequest, *StatsResponse) error
|
Stats(context.Context, *StatsRequest, *StatsResponse) error
|
||||||
Log(context.Context, *LogRequest, Debug_LogStream) error
|
Log(context.Context, *LogRequest, Debug_LogStream) error
|
||||||
|
Trace(context.Context, *TraceRequest, *TraceResponse) error
|
||||||
}
|
}
|
||||||
|
|
||||||
func RegisterDebugHandler(s server.Server, hdlr DebugHandler, opts ...server.HandlerOption) error {
|
func RegisterDebugHandler(s server.Server, hdlr DebugHandler, opts ...server.HandlerOption) error {
|
||||||
@ -134,6 +146,7 @@ func RegisterDebugHandler(s server.Server, hdlr DebugHandler, opts ...server.Han
|
|||||||
Health(ctx context.Context, in *HealthRequest, out *HealthResponse) error
|
Health(ctx context.Context, in *HealthRequest, out *HealthResponse) error
|
||||||
Stats(ctx context.Context, in *StatsRequest, out *StatsResponse) error
|
Stats(ctx context.Context, in *StatsRequest, out *StatsResponse) error
|
||||||
Log(ctx context.Context, stream server.Stream) error
|
Log(ctx context.Context, stream server.Stream) error
|
||||||
|
Trace(ctx context.Context, in *TraceRequest, out *TraceResponse) error
|
||||||
}
|
}
|
||||||
type Debug struct {
|
type Debug struct {
|
||||||
debug
|
debug
|
||||||
@ -188,3 +201,7 @@ func (x *debugLogStream) RecvMsg(m interface{}) error {
|
|||||||
func (x *debugLogStream) Send(m *Record) error {
|
func (x *debugLogStream) Send(m *Record) error {
|
||||||
return x.stream.Send(m)
|
return x.stream.Send(m)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *debugHandler) Trace(ctx context.Context, in *TraceRequest, out *TraceResponse) error {
|
||||||
|
return h.DebugHandler.Trace(ctx, in, out)
|
||||||
|
}
|
||||||
|
@ -4,6 +4,7 @@ service Debug {
|
|||||||
rpc Health(HealthRequest) returns (HealthResponse) {};
|
rpc Health(HealthRequest) returns (HealthResponse) {};
|
||||||
rpc Stats(StatsRequest) returns (StatsResponse) {};
|
rpc Stats(StatsRequest) returns (StatsResponse) {};
|
||||||
rpc Log(LogRequest) returns (stream Record) {};
|
rpc Log(LogRequest) returns (stream Record) {};
|
||||||
|
rpc Trace(TraceRequest) returns (TraceResponse) {};
|
||||||
}
|
}
|
||||||
|
|
||||||
message HealthRequest {
|
message HealthRequest {
|
||||||
@ -63,3 +64,30 @@ message Record {
|
|||||||
// message
|
// message
|
||||||
string message = 3;
|
string message = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message TraceRequest {
|
||||||
|
// trace id to retrieve
|
||||||
|
string id = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message TraceResponse {
|
||||||
|
repeated Span spans = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
message Span {
|
||||||
|
// the trace id
|
||||||
|
string trace = 1;
|
||||||
|
// id of the span
|
||||||
|
string id = 2;
|
||||||
|
// parent span
|
||||||
|
string parent = 3;
|
||||||
|
// name of the resource
|
||||||
|
string name = 4;
|
||||||
|
// time of start in nanoseconds
|
||||||
|
uint64 started = 5;
|
||||||
|
// duration of the execution in nanoseconds
|
||||||
|
uint64 duration = 6;
|
||||||
|
// associated metadata
|
||||||
|
map<string,string> metadata = 7;
|
||||||
|
}
|
||||||
|
@ -16,10 +16,28 @@ type trace struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *trace) Read(opts ...ReadOption) ([]*Span, error) {
|
func (t *trace) Read(opts ...ReadOption) ([]*Span, error) {
|
||||||
return []*Span{}, nil
|
var options ReadOptions
|
||||||
|
for _, o := range opts {
|
||||||
|
o(&options)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *trace) Start(ctx context.Context, name string) *Span {
|
sp := t.buffer.Get(t.buffer.Size())
|
||||||
|
|
||||||
|
var spans []*Span
|
||||||
|
|
||||||
|
for _, span := range sp {
|
||||||
|
val := span.Value.(*Span)
|
||||||
|
// skip if trace id is specified and doesn't match
|
||||||
|
if len(options.Trace) > 0 && val.Trace != options.Trace {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
spans = append(spans, val)
|
||||||
|
}
|
||||||
|
|
||||||
|
return spans, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *trace) Start(ctx context.Context, name string) (context.Context, *Span) {
|
||||||
span := &Span{
|
span := &Span{
|
||||||
Name: name,
|
Name: name,
|
||||||
Trace: uuid.New().String(),
|
Trace: uuid.New().String(),
|
||||||
@ -30,12 +48,12 @@ func (t *trace) Start(ctx context.Context, name string) *Span {
|
|||||||
|
|
||||||
// return span if no context
|
// return span if no context
|
||||||
if ctx == nil {
|
if ctx == nil {
|
||||||
return span
|
return context.Background(), span
|
||||||
}
|
}
|
||||||
|
|
||||||
s, ok := FromContext(ctx)
|
s, ok := FromContext(ctx)
|
||||||
if !ok {
|
if !ok {
|
||||||
return span
|
return ctx, span
|
||||||
}
|
}
|
||||||
|
|
||||||
// set trace id
|
// set trace id
|
||||||
@ -44,12 +62,12 @@ func (t *trace) Start(ctx context.Context, name string) *Span {
|
|||||||
span.Parent = s.Id
|
span.Parent = s.Id
|
||||||
|
|
||||||
// return the sapn
|
// return the sapn
|
||||||
return span
|
return ctx, span
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *trace) Finish(s *Span) error {
|
func (t *trace) Finish(s *Span) error {
|
||||||
// set finished time
|
// set finished time
|
||||||
s.Finished = time.Now()
|
s.Duration = time.Since(s.Started)
|
||||||
|
|
||||||
// save the span
|
// save the span
|
||||||
t.buffer.Put(s)
|
t.buffer.Put(s)
|
||||||
|
@ -10,3 +10,10 @@ type ReadOptions struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ReadOption func(o *ReadOptions)
|
type ReadOption func(o *ReadOptions)
|
||||||
|
|
||||||
|
// Read the given trace
|
||||||
|
func ReadTrace(t string) ReadOption {
|
||||||
|
return func(o *ReadOptions) {
|
||||||
|
o.Trace = t
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -9,7 +9,7 @@ import (
|
|||||||
// Trace is an interface for distributed tracing
|
// Trace is an interface for distributed tracing
|
||||||
type Trace interface {
|
type Trace interface {
|
||||||
// Start a trace
|
// Start a trace
|
||||||
Start(ctx context.Context, name string) *Span
|
Start(ctx context.Context, name string) (context.Context, *Span)
|
||||||
// Finish the trace
|
// Finish the trace
|
||||||
Finish(*Span) error
|
Finish(*Span) error
|
||||||
// Read the traces
|
// Read the traces
|
||||||
@ -28,14 +28,19 @@ type Span struct {
|
|||||||
Parent string
|
Parent string
|
||||||
// Start time
|
// Start time
|
||||||
Started time.Time
|
Started time.Time
|
||||||
// Finish time
|
// Duration in nano seconds
|
||||||
Finished time.Time
|
Duration time.Duration
|
||||||
// associated data
|
// associated data
|
||||||
Metadata map[string]string
|
Metadata map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
type spanKey struct{}
|
type spanKey struct{}
|
||||||
|
|
||||||
|
var (
|
||||||
|
// Default tracer
|
||||||
|
DefaultTrace = NewTrace()
|
||||||
|
)
|
||||||
|
|
||||||
// FromContext returns a span from context
|
// FromContext returns a span from context
|
||||||
func FromContext(ctx context.Context) (*Span, bool) {
|
func FromContext(ctx context.Context) (*Span, bool) {
|
||||||
s, ok := ctx.Value(spanKey{}).(*Span)
|
s, ok := ctx.Value(spanKey{}).(*Span)
|
||||||
|
6
go.mod
6
go.mod
@ -19,7 +19,7 @@ require (
|
|||||||
github.com/go-acme/lego/v3 v3.3.0
|
github.com/go-acme/lego/v3 v3.3.0
|
||||||
github.com/go-playground/universal-translator v0.17.0 // indirect
|
github.com/go-playground/universal-translator v0.17.0 // indirect
|
||||||
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible // indirect
|
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible // indirect
|
||||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 // indirect
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect
|
||||||
github.com/golang/protobuf v1.3.2
|
github.com/golang/protobuf v1.3.2
|
||||||
github.com/google/uuid v1.1.1
|
github.com/google/uuid v1.1.1
|
||||||
github.com/gorilla/handlers v1.4.2
|
github.com/gorilla/handlers v1.4.2
|
||||||
@ -36,7 +36,7 @@ require (
|
|||||||
github.com/lib/pq v1.3.0
|
github.com/lib/pq v1.3.0
|
||||||
github.com/lucas-clemente/quic-go v0.14.1
|
github.com/lucas-clemente/quic-go v0.14.1
|
||||||
github.com/mholt/certmagic v0.9.1
|
github.com/mholt/certmagic v0.9.1
|
||||||
github.com/micro/cli v0.2.0
|
github.com/micro/cli/v2 v2.1.1
|
||||||
github.com/micro/mdns v0.3.0
|
github.com/micro/mdns v0.3.0
|
||||||
github.com/miekg/dns v1.1.27
|
github.com/miekg/dns v1.1.27
|
||||||
github.com/mitchellh/hashstructure v1.0.0
|
github.com/mitchellh/hashstructure v1.0.0
|
||||||
@ -48,7 +48,7 @@ require (
|
|||||||
github.com/soheilhy/cmux v0.1.4 // indirect
|
github.com/soheilhy/cmux v0.1.4 // indirect
|
||||||
github.com/stretchr/testify v1.4.0
|
github.com/stretchr/testify v1.4.0
|
||||||
github.com/technoweenie/multipartstreamer v1.0.1 // indirect
|
github.com/technoweenie/multipartstreamer v1.0.1 // indirect
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc // indirect
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect
|
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect
|
||||||
go.etcd.io/bbolt v1.3.3 // indirect
|
go.etcd.io/bbolt v1.3.3 // indirect
|
||||||
go.uber.org/zap v1.13.0
|
go.uber.org/zap v1.13.0
|
||||||
|
19
go.sum
19
go.sum
@ -97,6 +97,7 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7
|
|||||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg=
|
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg=
|
||||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||||
github.com/cpu/goacmedns v0.0.1/go.mod h1:sesf/pNnCYwUevQEQfEwY0Y3DydlQWSGZbaMElOWxok=
|
github.com/cpu/goacmedns v0.0.1/go.mod h1:sesf/pNnCYwUevQEQfEwY0Y3DydlQWSGZbaMElOWxok=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
@ -161,9 +162,10 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV
|
|||||||
github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
|
github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA=
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
|
||||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
|
github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk=
|
||||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s=
|
github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s=
|
||||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||||
@ -173,6 +175,7 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
|
|||||||
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
|
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
|
||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=
|
||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
|
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
|
||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
@ -276,8 +279,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0j
|
|||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
github.com/mholt/certmagic v0.9.1 h1:wPzyouOyE+30NIQETJuhTB5ZQWz+0Hy038vaR5WWQDE=
|
github.com/mholt/certmagic v0.9.1 h1:wPzyouOyE+30NIQETJuhTB5ZQWz+0Hy038vaR5WWQDE=
|
||||||
github.com/mholt/certmagic v0.9.1/go.mod h1:nu8jbsbtwK4205EDH/ZUMTKsfYpJA1Q7MKXHfgTihNw=
|
github.com/mholt/certmagic v0.9.1/go.mod h1:nu8jbsbtwK4205EDH/ZUMTKsfYpJA1Q7MKXHfgTihNw=
|
||||||
github.com/micro/cli v0.2.0 h1:ut3rV5JWqZjsXIa2MvGF+qMUP8DAUTvHX9Br5gO4afA=
|
github.com/micro/cli/v2 v2.1.1 h1:uFw0SMIKmGuyHIm8lXns/NOn7V62bM5y7DnlxUM+BEQ=
|
||||||
github.com/micro/cli v0.2.0/go.mod h1:jRT9gmfVKWSS6pkKcXQ8YhUyj6bzwxK8Fp5b0Y7qNnk=
|
github.com/micro/cli/v2 v2.1.1/go.mod h1:EguNh6DAoWKm9nmk+k/Rg0H3lQnDxqzu5x5srOtGtYg=
|
||||||
github.com/micro/mdns v0.3.0 h1:bYycYe+98AXR3s8Nq5qvt6C573uFTDPIYzJemWON0QE=
|
github.com/micro/mdns v0.3.0 h1:bYycYe+98AXR3s8Nq5qvt6C573uFTDPIYzJemWON0QE=
|
||||||
github.com/micro/mdns v0.3.0/go.mod h1:KJ0dW7KmicXU2BV++qkLlmHYcVv7/hHnbtguSWt9Aoc=
|
github.com/micro/mdns v0.3.0/go.mod h1:KJ0dW7KmicXU2BV++qkLlmHYcVv7/hHnbtguSWt9Aoc=
|
||||||
github.com/miekg/dns v1.1.3/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
github.com/miekg/dns v1.1.3/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||||
@ -373,11 +376,13 @@ github.com/rainycape/memcache v0.0.0-20150622160815-1031fa0ce2f2/go.mod h1:7tZKc
|
|||||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
|
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
|
||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/sacloud/libsacloud v1.26.1/go.mod h1:79ZwATmHLIFZIMd7sxA3LwzVy/B77uj3LDoToVTxDoQ=
|
github.com/sacloud/libsacloud v1.26.1/go.mod h1:79ZwATmHLIFZIMd7sxA3LwzVy/B77uj3LDoToVTxDoQ=
|
||||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||||
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
|
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
|
||||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
||||||
|
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
|
||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||||
@ -401,8 +406,8 @@ github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG
|
|||||||
github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM=
|
github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM=
|
||||||
github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog=
|
github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog=
|
||||||
github.com/timewasted/linode v0.0.0-20160829202747-37e84520dcf7/go.mod h1:imsgLplxEC/etjIhdr3dNzV3JeT27LbVu5pYWm0JCBY=
|
github.com/timewasted/linode v0.0.0-20160829202747-37e84520dcf7/go.mod h1:imsgLplxEC/etjIhdr3dNzV3JeT27LbVu5pYWm0JCBY=
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ=
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc h1:yUaosFVTJwnltaHbSNC3i82I92quFs+OFPRl8kNMVwo=
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||||
github.com/transip/gotransip v0.0.0-20190812104329-6d8d9179b66f/go.mod h1:i0f4R4o2HM0m3DZYQWsj6/MEowD57VzoH0v3d7igeFY=
|
github.com/transip/gotransip v0.0.0-20190812104329-6d8d9179b66f/go.mod h1:i0f4R4o2HM0m3DZYQWsj6/MEowD57VzoH0v3d7igeFY=
|
||||||
github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g=
|
github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g=
|
||||||
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||||
@ -464,6 +469,7 @@ golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTk
|
|||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
|
||||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE=
|
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE=
|
||||||
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
||||||
@ -559,6 +565,7 @@ golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtn
|
|||||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs=
|
||||||
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
@ -4,7 +4,6 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/micro/cli"
|
|
||||||
"github.com/micro/go-micro/broker"
|
"github.com/micro/go-micro/broker"
|
||||||
"github.com/micro/go-micro/client"
|
"github.com/micro/go-micro/client"
|
||||||
"github.com/micro/go-micro/client/selector"
|
"github.com/micro/go-micro/client/selector"
|
||||||
@ -12,6 +11,7 @@ import (
|
|||||||
"github.com/micro/go-micro/registry"
|
"github.com/micro/go-micro/registry"
|
||||||
"github.com/micro/go-micro/server"
|
"github.com/micro/go-micro/server"
|
||||||
"github.com/micro/go-micro/transport"
|
"github.com/micro/go-micro/transport"
|
||||||
|
"github.com/micro/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Options struct {
|
type Options struct {
|
||||||
@ -166,7 +166,7 @@ func Flags(flags ...cli.Flag) Option {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Action(a func(*cli.Context)) Option {
|
func Action(a func(*cli.Context) error) Option {
|
||||||
return func(o *Options) {
|
return func(o *Options) {
|
||||||
o.Cmd.App().Action = a
|
o.Cmd.App().Action = a
|
||||||
}
|
}
|
||||||
|
10
service.go
10
service.go
@ -15,6 +15,7 @@ import (
|
|||||||
"github.com/micro/go-micro/debug/profile/pprof"
|
"github.com/micro/go-micro/debug/profile/pprof"
|
||||||
"github.com/micro/go-micro/debug/service/handler"
|
"github.com/micro/go-micro/debug/service/handler"
|
||||||
"github.com/micro/go-micro/debug/stats"
|
"github.com/micro/go-micro/debug/stats"
|
||||||
|
"github.com/micro/go-micro/debug/trace"
|
||||||
"github.com/micro/go-micro/plugin"
|
"github.com/micro/go-micro/plugin"
|
||||||
"github.com/micro/go-micro/server"
|
"github.com/micro/go-micro/server"
|
||||||
"github.com/micro/go-micro/util/log"
|
"github.com/micro/go-micro/util/log"
|
||||||
@ -36,8 +37,15 @@ func newService(opts ...Option) Service {
|
|||||||
// wrap client to inject From-Service header on any calls
|
// wrap client to inject From-Service header on any calls
|
||||||
options.Client = wrapper.FromService(serviceName, options.Client)
|
options.Client = wrapper.FromService(serviceName, options.Client)
|
||||||
|
|
||||||
|
// wrap client to inject From-Service header on any calls
|
||||||
|
options.Client = wrapper.TraceCall(serviceName, trace.DefaultTrace, options.Client)
|
||||||
|
|
||||||
// wrap the server to provide handler stats
|
// wrap the server to provide handler stats
|
||||||
options.Server.Init(server.WrapHandler(wrapper.HandlerStats(stats.DefaultStats)))
|
options.Server.Init(
|
||||||
|
server.WrapHandler(wrapper.HandlerStats(stats.DefaultStats)),
|
||||||
|
server.WrapHandler(wrapper.TraceHandler(trace.DefaultTrace)),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
return &service{
|
return &service{
|
||||||
opts: options,
|
opts: options,
|
||||||
|
@ -433,7 +433,7 @@ func (t *tun) process() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// send the message
|
// send the message
|
||||||
t.sendTo(sendTo, msg)
|
go t.sendTo(sendTo, msg)
|
||||||
case <-t.closed:
|
case <-t.closed:
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
|
|
||||||
"github.com/micro/go-micro/client"
|
"github.com/micro/go-micro/client"
|
||||||
"github.com/micro/go-micro/debug/stats"
|
"github.com/micro/go-micro/debug/stats"
|
||||||
|
"github.com/micro/go-micro/debug/trace"
|
||||||
"github.com/micro/go-micro/metadata"
|
"github.com/micro/go-micro/metadata"
|
||||||
"github.com/micro/go-micro/server"
|
"github.com/micro/go-micro/server"
|
||||||
)
|
)
|
||||||
@ -14,6 +15,13 @@ type clientWrapper struct {
|
|||||||
headers metadata.Metadata
|
headers metadata.Metadata
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type traceWrapper struct {
|
||||||
|
client.Client
|
||||||
|
|
||||||
|
name string
|
||||||
|
trace trace.Trace
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
HeaderPrefix = "Micro-"
|
HeaderPrefix = "Micro-"
|
||||||
)
|
)
|
||||||
@ -48,6 +56,20 @@ func (c *clientWrapper) Publish(ctx context.Context, p client.Message, opts ...c
|
|||||||
return c.Client.Publish(ctx, p, opts...)
|
return c.Client.Publish(ctx, p, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *traceWrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error {
|
||||||
|
newCtx, s := c.trace.Start(ctx, req.Service()+"."+req.Endpoint())
|
||||||
|
|
||||||
|
err := c.Client.Call(newCtx, req, rsp, opts...)
|
||||||
|
if err != nil {
|
||||||
|
s.Metadata["error"] = err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
// finish the trace
|
||||||
|
c.trace.Finish(s)
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// FromService wraps a client to inject From-Service header into metadata
|
// FromService wraps a client to inject From-Service header into metadata
|
||||||
func FromService(name string, c client.Client) client.Client {
|
func FromService(name string, c client.Client) client.Client {
|
||||||
return &clientWrapper{
|
return &clientWrapper{
|
||||||
@ -73,3 +95,34 @@ func HandlerStats(stats stats.Stats) server.HandlerWrapper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TraceCall is a call tracing wrapper
|
||||||
|
func TraceCall(name string, t trace.Trace, c client.Client) client.Client {
|
||||||
|
return &traceWrapper{
|
||||||
|
name: name,
|
||||||
|
trace: t,
|
||||||
|
Client: c,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TraceHandler wraps a server handler to perform tracing
|
||||||
|
func TraceHandler(t trace.Trace) server.HandlerWrapper {
|
||||||
|
// return a handler wrapper
|
||||||
|
return func(h server.HandlerFunc) server.HandlerFunc {
|
||||||
|
// return a function that returns a function
|
||||||
|
return func(ctx context.Context, req server.Request, rsp interface{}) error {
|
||||||
|
// get the span
|
||||||
|
newCtx, s := t.Start(ctx, req.Service()+"."+req.Endpoint())
|
||||||
|
|
||||||
|
err := h(newCtx, req, rsp)
|
||||||
|
if err != nil {
|
||||||
|
s.Metadata["error"] = err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
// finish
|
||||||
|
t.Finish(s)
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -6,7 +6,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/micro/cli"
|
"github.com/micro/cli/v2"
|
||||||
"github.com/micro/go-micro"
|
"github.com/micro/go-micro"
|
||||||
"github.com/micro/go-micro/registry"
|
"github.com/micro/go-micro/registry"
|
||||||
)
|
)
|
||||||
|
@ -14,7 +14,6 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/micro/cli"
|
|
||||||
"github.com/micro/go-micro"
|
"github.com/micro/go-micro"
|
||||||
"github.com/micro/go-micro/registry"
|
"github.com/micro/go-micro/registry"
|
||||||
maddr "github.com/micro/go-micro/util/addr"
|
maddr "github.com/micro/go-micro/util/addr"
|
||||||
@ -22,6 +21,7 @@ import (
|
|||||||
"github.com/micro/go-micro/util/log"
|
"github.com/micro/go-micro/util/log"
|
||||||
mnet "github.com/micro/go-micro/util/net"
|
mnet "github.com/micro/go-micro/util/net"
|
||||||
mls "github.com/micro/go-micro/util/tls"
|
mls "github.com/micro/go-micro/util/tls"
|
||||||
|
"github.com/micro/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
type service struct {
|
type service struct {
|
||||||
@ -327,7 +327,7 @@ func (s *service) Init(opts ...Option) error {
|
|||||||
serviceOpts = append(serviceOpts, micro.Registry(s.opts.Registry))
|
serviceOpts = append(serviceOpts, micro.Registry(s.opts.Registry))
|
||||||
}
|
}
|
||||||
|
|
||||||
serviceOpts = append(serviceOpts, micro.Action(func(ctx *cli.Context) {
|
serviceOpts = append(serviceOpts, micro.Action(func(ctx *cli.Context) error {
|
||||||
if ttl := ctx.Int("register_ttl"); ttl > 0 {
|
if ttl := ctx.Int("register_ttl"); ttl > 0 {
|
||||||
s.opts.RegisterTTL = time.Duration(ttl) * time.Second
|
s.opts.RegisterTTL = time.Duration(ttl) * time.Second
|
||||||
}
|
}
|
||||||
@ -359,6 +359,8 @@ func (s *service) Init(opts ...Option) error {
|
|||||||
if s.opts.Action != nil {
|
if s.opts.Action != nil {
|
||||||
s.opts.Action(ctx)
|
s.opts.Action(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}))
|
}))
|
||||||
|
|
||||||
s.opts.Service.Init(serviceOpts...)
|
s.opts.Service.Init(serviceOpts...)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user