mirror of
https://github.com/cloudflare/cloudflared.git
synced 2025-05-22 14:26:34 +00:00

Adds new suite of metrics to capture the following for capnp rpcs operations: - Method calls - Method call failures - Method call latencies Each of the operations is labeled by the handler that serves the method and the method of operation invoked. Additionally, each of these are split between if the operation was called by a client or served.
103 lines
2.8 KiB
Go
103 lines
2.8 KiB
Go
package pogs
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
capnp "zombiezen.com/go/capnproto2"
|
|
"zombiezen.com/go/capnproto2/rpc"
|
|
"zombiezen.com/go/capnproto2/server"
|
|
|
|
"github.com/cloudflare/cloudflared/tunnelrpc/metrics"
|
|
"github.com/cloudflare/cloudflared/tunnelrpc/proto"
|
|
)
|
|
|
|
type ConfigurationManager interface {
|
|
// UpdateConfiguration is the call provided to cloudflared to load the latest remote configuration.
|
|
UpdateConfiguration(ctx context.Context, version int32, config []byte) *UpdateConfigurationResponse
|
|
}
|
|
|
|
type ConfigurationManager_PogsImpl struct {
|
|
impl ConfigurationManager
|
|
}
|
|
|
|
func ConfigurationManager_ServerToClient(c ConfigurationManager) proto.ConfigurationManager {
|
|
return proto.ConfigurationManager_ServerToClient(ConfigurationManager_PogsImpl{c})
|
|
}
|
|
|
|
func (i ConfigurationManager_PogsImpl) UpdateConfiguration(p proto.ConfigurationManager_updateConfiguration) error {
|
|
return metrics.ObserveServerHandler(func() error { return i.updateConfiguration(p) }, metrics.ConfigurationManager, metrics.OperationUpdateConfiguration)
|
|
}
|
|
|
|
func (i ConfigurationManager_PogsImpl) updateConfiguration(p proto.ConfigurationManager_updateConfiguration) error {
|
|
server.Ack(p.Options)
|
|
|
|
version := p.Params.Version()
|
|
config, err := p.Params.Config()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
result, err := p.Results.NewResult()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
updateResp := i.impl.UpdateConfiguration(p.Ctx, version, config)
|
|
return updateResp.Marshal(result)
|
|
}
|
|
|
|
type ConfigurationManager_PogsClient struct {
|
|
Client capnp.Client
|
|
Conn *rpc.Conn
|
|
}
|
|
|
|
func (c ConfigurationManager_PogsClient) Close() error {
|
|
c.Client.Close()
|
|
return c.Conn.Close()
|
|
}
|
|
|
|
func (c ConfigurationManager_PogsClient) UpdateConfiguration(ctx context.Context, version int32, config []byte) (*UpdateConfigurationResponse, error) {
|
|
client := proto.ConfigurationManager{Client: c.Client}
|
|
promise := client.UpdateConfiguration(ctx, func(p proto.ConfigurationManager_updateConfiguration_Params) error {
|
|
p.SetVersion(version)
|
|
return p.SetConfig(config)
|
|
})
|
|
result, err := promise.Result().Struct()
|
|
if err != nil {
|
|
return nil, wrapRPCError(err)
|
|
}
|
|
response := new(UpdateConfigurationResponse)
|
|
|
|
err = response.Unmarshal(result)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return response, nil
|
|
}
|
|
|
|
type UpdateConfigurationResponse struct {
|
|
LastAppliedVersion int32 `json:"lastAppliedVersion"`
|
|
Err error `json:"err"`
|
|
}
|
|
|
|
func (p *UpdateConfigurationResponse) Marshal(s proto.UpdateConfigurationResponse) error {
|
|
s.SetLatestAppliedVersion(p.LastAppliedVersion)
|
|
if p.Err != nil {
|
|
return s.SetErr(p.Err.Error())
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (p *UpdateConfigurationResponse) Unmarshal(s proto.UpdateConfigurationResponse) error {
|
|
p.LastAppliedVersion = s.LatestAppliedVersion()
|
|
respErr, err := s.Err()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if respErr != "" {
|
|
p.Err = fmt.Errorf(respErr)
|
|
}
|
|
return nil
|
|
}
|