mirror of
https://github.com/1Password/onepassword-operator.git
synced 2025-10-22 23:48:05 +00:00
Clear repo
To be able to perform the migration, we need to start from an empty directory/repo.
This commit is contained in:
54
vendor/github.com/uber/jaeger-client-go/utils/http_json.go
generated
vendored
54
vendor/github.com/uber/jaeger-client-go/utils/http_json.go
generated
vendored
@@ -1,54 +0,0 @@
|
||||
// Copyright (c) 2017 Uber Technologies, Inc.
|
||||
//
|
||||
// Licensed 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 utils
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// GetJSON makes an HTTP call to the specified URL and parses the returned JSON into `out`.
|
||||
func GetJSON(url string, out interface{}) error {
|
||||
resp, err := http.Get(url)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return ReadJSON(resp, out)
|
||||
}
|
||||
|
||||
// ReadJSON reads JSON from http.Response and parses it into `out`
|
||||
func ReadJSON(resp *http.Response, out interface{}) error {
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode >= 400 {
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return fmt.Errorf("StatusCode: %d, Body: %s", resp.StatusCode, body)
|
||||
}
|
||||
|
||||
if out == nil {
|
||||
io.Copy(ioutil.Discard, resp.Body)
|
||||
return nil
|
||||
}
|
||||
|
||||
decoder := json.NewDecoder(resp.Body)
|
||||
return decoder.Decode(out)
|
||||
}
|
84
vendor/github.com/uber/jaeger-client-go/utils/localip.go
generated
vendored
84
vendor/github.com/uber/jaeger-client-go/utils/localip.go
generated
vendored
@@ -1,84 +0,0 @@
|
||||
// Copyright (c) 2017 Uber Technologies, Inc.
|
||||
//
|
||||
// Licensed 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 utils
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net"
|
||||
)
|
||||
|
||||
// This code is borrowed from https://github.com/uber/tchannel-go/blob/dev/localip.go
|
||||
|
||||
// scoreAddr scores how likely the given addr is to be a remote address and returns the
|
||||
// IP to use when listening. Any address which receives a negative score should not be used.
|
||||
// Scores are calculated as:
|
||||
// -1 for any unknown IP addresses.
|
||||
// +300 for IPv4 addresses
|
||||
// +100 for non-local addresses, extra +100 for "up" interaces.
|
||||
func scoreAddr(iface net.Interface, addr net.Addr) (int, net.IP) {
|
||||
var ip net.IP
|
||||
if netAddr, ok := addr.(*net.IPNet); ok {
|
||||
ip = netAddr.IP
|
||||
} else if netIP, ok := addr.(*net.IPAddr); ok {
|
||||
ip = netIP.IP
|
||||
} else {
|
||||
return -1, nil
|
||||
}
|
||||
|
||||
var score int
|
||||
if ip.To4() != nil {
|
||||
score += 300
|
||||
}
|
||||
if iface.Flags&net.FlagLoopback == 0 && !ip.IsLoopback() {
|
||||
score += 100
|
||||
if iface.Flags&net.FlagUp != 0 {
|
||||
score += 100
|
||||
}
|
||||
}
|
||||
return score, ip
|
||||
}
|
||||
|
||||
// HostIP tries to find an IP that can be used by other machines to reach this machine.
|
||||
func HostIP() (net.IP, error) {
|
||||
interfaces, err := net.Interfaces()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
bestScore := -1
|
||||
var bestIP net.IP
|
||||
// Select the highest scoring IP as the best IP.
|
||||
for _, iface := range interfaces {
|
||||
addrs, err := iface.Addrs()
|
||||
if err != nil {
|
||||
// Skip this interface if there is an error.
|
||||
continue
|
||||
}
|
||||
|
||||
for _, addr := range addrs {
|
||||
score, ip := scoreAddr(iface, addr)
|
||||
if score > bestScore {
|
||||
bestScore = score
|
||||
bestIP = ip
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if bestScore == -1 {
|
||||
return nil, errors.New("no addresses to listen on")
|
||||
}
|
||||
|
||||
return bestIP, nil
|
||||
}
|
46
vendor/github.com/uber/jaeger-client-go/utils/rand.go
generated
vendored
46
vendor/github.com/uber/jaeger-client-go/utils/rand.go
generated
vendored
@@ -1,46 +0,0 @@
|
||||
// Copyright (c) 2017 Uber Technologies, Inc.
|
||||
//
|
||||
// Licensed 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 utils
|
||||
|
||||
import (
|
||||
"math/rand"
|
||||
"sync"
|
||||
)
|
||||
|
||||
// lockedSource allows a random number generator to be used by multiple goroutines concurrently.
|
||||
// The code is very similar to math/rand.lockedSource, which is unfortunately not exposed.
|
||||
type lockedSource struct {
|
||||
mut sync.Mutex
|
||||
src rand.Source
|
||||
}
|
||||
|
||||
// NewRand returns a rand.Rand that is threadsafe.
|
||||
func NewRand(seed int64) *rand.Rand {
|
||||
return rand.New(&lockedSource{src: rand.NewSource(seed)})
|
||||
}
|
||||
|
||||
func (r *lockedSource) Int63() (n int64) {
|
||||
r.mut.Lock()
|
||||
n = r.src.Int63()
|
||||
r.mut.Unlock()
|
||||
return
|
||||
}
|
||||
|
||||
// Seed implements Seed() of Source
|
||||
func (r *lockedSource) Seed(seed int64) {
|
||||
r.mut.Lock()
|
||||
r.src.Seed(seed)
|
||||
r.mut.Unlock()
|
||||
}
|
112
vendor/github.com/uber/jaeger-client-go/utils/rate_limiter.go
generated
vendored
112
vendor/github.com/uber/jaeger-client-go/utils/rate_limiter.go
generated
vendored
@@ -1,112 +0,0 @@
|
||||
// Copyright (c) 2017 Uber Technologies, Inc.
|
||||
//
|
||||
// Licensed 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 utils
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
// RateLimiter is a filter used to check if a message that is worth itemCost units is within the rate limits.
|
||||
//
|
||||
// TODO (breaking change) remove this interface in favor of public struct below
|
||||
//
|
||||
// Deprecated, use ReconfigurableRateLimiter.
|
||||
type RateLimiter interface {
|
||||
CheckCredit(itemCost float64) bool
|
||||
}
|
||||
|
||||
// ReconfigurableRateLimiter is a rate limiter based on leaky bucket algorithm, formulated in terms of a
|
||||
// credits balance that is replenished every time CheckCredit() method is called (tick) by the amount proportional
|
||||
// to the time elapsed since the last tick, up to max of creditsPerSecond. A call to CheckCredit() takes a cost
|
||||
// of an item we want to pay with the balance. If the balance exceeds the cost of the item, the item is "purchased"
|
||||
// and the balance reduced, indicated by returned value of true. Otherwise the balance is unchanged and return false.
|
||||
//
|
||||
// This can be used to limit a rate of messages emitted by a service by instantiating the Rate Limiter with the
|
||||
// max number of messages a service is allowed to emit per second, and calling CheckCredit(1.0) for each message
|
||||
// to determine if the message is within the rate limit.
|
||||
//
|
||||
// It can also be used to limit the rate of traffic in bytes, by setting creditsPerSecond to desired throughput
|
||||
// as bytes/second, and calling CheckCredit() with the actual message size.
|
||||
//
|
||||
// TODO (breaking change) rename to RateLimiter once the interface is removed
|
||||
type ReconfigurableRateLimiter struct {
|
||||
lock sync.Mutex
|
||||
|
||||
creditsPerSecond float64
|
||||
balance float64
|
||||
maxBalance float64
|
||||
lastTick time.Time
|
||||
|
||||
timeNow func() time.Time
|
||||
}
|
||||
|
||||
// NewRateLimiter creates a new ReconfigurableRateLimiter.
|
||||
func NewRateLimiter(creditsPerSecond, maxBalance float64) *ReconfigurableRateLimiter {
|
||||
return &ReconfigurableRateLimiter{
|
||||
creditsPerSecond: creditsPerSecond,
|
||||
balance: maxBalance,
|
||||
maxBalance: maxBalance,
|
||||
lastTick: time.Now(),
|
||||
timeNow: time.Now,
|
||||
}
|
||||
}
|
||||
|
||||
// CheckCredit tries to reduce the current balance by itemCost provided that the current balance
|
||||
// is not lest than itemCost.
|
||||
func (rl *ReconfigurableRateLimiter) CheckCredit(itemCost float64) bool {
|
||||
rl.lock.Lock()
|
||||
defer rl.lock.Unlock()
|
||||
|
||||
// if we have enough credits to pay for current item, then reduce balance and allow
|
||||
if rl.balance >= itemCost {
|
||||
rl.balance -= itemCost
|
||||
return true
|
||||
}
|
||||
// otherwise check if balance can be increased due to time elapsed, and try again
|
||||
rl.updateBalance()
|
||||
if rl.balance >= itemCost {
|
||||
rl.balance -= itemCost
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// updateBalance recalculates current balance based on time elapsed. Must be called while holding a lock.
|
||||
func (rl *ReconfigurableRateLimiter) updateBalance() {
|
||||
// calculate how much time passed since the last tick, and update current tick
|
||||
currentTime := rl.timeNow()
|
||||
elapsedTime := currentTime.Sub(rl.lastTick)
|
||||
rl.lastTick = currentTime
|
||||
// calculate how much credit have we accumulated since the last tick
|
||||
rl.balance += elapsedTime.Seconds() * rl.creditsPerSecond
|
||||
if rl.balance > rl.maxBalance {
|
||||
rl.balance = rl.maxBalance
|
||||
}
|
||||
}
|
||||
|
||||
// Update changes the main parameters of the rate limiter in-place, while retaining
|
||||
// the current accumulated balance (pro-rated to the new maxBalance value). Using this method
|
||||
// instead of creating a new rate limiter helps to avoid thundering herd when sampling
|
||||
// strategies are updated.
|
||||
func (rl *ReconfigurableRateLimiter) Update(creditsPerSecond, maxBalance float64) {
|
||||
rl.lock.Lock()
|
||||
defer rl.lock.Unlock()
|
||||
|
||||
rl.updateBalance() // get up to date balance
|
||||
rl.balance = rl.balance * maxBalance / rl.maxBalance
|
||||
rl.creditsPerSecond = creditsPerSecond
|
||||
rl.maxBalance = maxBalance
|
||||
}
|
189
vendor/github.com/uber/jaeger-client-go/utils/reconnecting_udp_conn.go
generated
vendored
189
vendor/github.com/uber/jaeger-client-go/utils/reconnecting_udp_conn.go
generated
vendored
@@ -1,189 +0,0 @@
|
||||
// Copyright (c) 2020 The Jaeger Authors.
|
||||
//
|
||||
// Licensed 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 utils
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"github.com/uber/jaeger-client-go/log"
|
||||
)
|
||||
|
||||
// reconnectingUDPConn is an implementation of udpConn that resolves hostPort every resolveTimeout, if the resolved address is
|
||||
// different than the current conn then the new address is dialed and the conn is swapped.
|
||||
type reconnectingUDPConn struct {
|
||||
hostPort string
|
||||
resolveFunc resolveFunc
|
||||
dialFunc dialFunc
|
||||
logger log.Logger
|
||||
bufferBytes int64
|
||||
|
||||
connMtx sync.RWMutex
|
||||
conn *net.UDPConn
|
||||
destAddr *net.UDPAddr
|
||||
closeChan chan struct{}
|
||||
}
|
||||
|
||||
type resolveFunc func(network string, hostPort string) (*net.UDPAddr, error)
|
||||
type dialFunc func(network string, laddr, raddr *net.UDPAddr) (*net.UDPConn, error)
|
||||
|
||||
// newReconnectingUDPConn returns a new udpConn that resolves hostPort every resolveTimeout, if the resolved address is
|
||||
// different than the current conn then the new address is dialed and the conn is swapped.
|
||||
func newReconnectingUDPConn(hostPort string, resolveTimeout time.Duration, resolveFunc resolveFunc, dialFunc dialFunc, logger log.Logger) (*reconnectingUDPConn, error) {
|
||||
conn := &reconnectingUDPConn{
|
||||
hostPort: hostPort,
|
||||
resolveFunc: resolveFunc,
|
||||
dialFunc: dialFunc,
|
||||
logger: logger,
|
||||
closeChan: make(chan struct{}),
|
||||
}
|
||||
|
||||
if err := conn.attemptResolveAndDial(); err != nil {
|
||||
logger.Error(fmt.Sprintf("failed resolving destination address on connection startup, with err: %q. retrying in %s", err.Error(), resolveTimeout))
|
||||
}
|
||||
|
||||
go conn.reconnectLoop(resolveTimeout)
|
||||
|
||||
return conn, nil
|
||||
}
|
||||
|
||||
func (c *reconnectingUDPConn) reconnectLoop(resolveTimeout time.Duration) {
|
||||
ticker := time.NewTicker(resolveTimeout)
|
||||
defer ticker.Stop()
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-c.closeChan:
|
||||
return
|
||||
case <-ticker.C:
|
||||
if err := c.attemptResolveAndDial(); err != nil {
|
||||
c.logger.Error(err.Error())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (c *reconnectingUDPConn) attemptResolveAndDial() error {
|
||||
newAddr, err := c.resolveFunc("udp", c.hostPort)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to resolve new addr for host %q, with err: %w", c.hostPort, err)
|
||||
}
|
||||
|
||||
c.connMtx.RLock()
|
||||
curAddr := c.destAddr
|
||||
c.connMtx.RUnlock()
|
||||
|
||||
// dont attempt dial if an addr was successfully dialed previously and, resolved addr is the same as current conn
|
||||
if curAddr != nil && newAddr.String() == curAddr.String() {
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := c.attemptDialNewAddr(newAddr); err != nil {
|
||||
return fmt.Errorf("failed to dial newly resolved addr '%s', with err: %w", newAddr, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *reconnectingUDPConn) attemptDialNewAddr(newAddr *net.UDPAddr) error {
|
||||
connUDP, err := c.dialFunc(newAddr.Network(), nil, newAddr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if bufferBytes := int(atomic.LoadInt64(&c.bufferBytes)); bufferBytes != 0 {
|
||||
if err = connUDP.SetWriteBuffer(bufferBytes); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
c.connMtx.Lock()
|
||||
c.destAddr = newAddr
|
||||
// store prev to close later
|
||||
prevConn := c.conn
|
||||
c.conn = connUDP
|
||||
c.connMtx.Unlock()
|
||||
|
||||
if prevConn != nil {
|
||||
return prevConn.Close()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Write calls net.udpConn.Write, if it fails an attempt is made to connect to a new addr, if that succeeds the write is retried before returning
|
||||
func (c *reconnectingUDPConn) Write(b []byte) (int, error) {
|
||||
var bytesWritten int
|
||||
var err error
|
||||
|
||||
c.connMtx.RLock()
|
||||
if c.conn == nil {
|
||||
// if connection is not initialized indicate this with err in order to hook into retry logic
|
||||
err = fmt.Errorf("UDP connection not yet initialized, an address has not been resolved")
|
||||
} else {
|
||||
bytesWritten, err = c.conn.Write(b)
|
||||
}
|
||||
c.connMtx.RUnlock()
|
||||
|
||||
if err == nil {
|
||||
return bytesWritten, nil
|
||||
}
|
||||
|
||||
// attempt to resolve and dial new address in case that's the problem, if resolve and dial succeeds, try write again
|
||||
if reconnErr := c.attemptResolveAndDial(); reconnErr == nil {
|
||||
c.connMtx.RLock()
|
||||
defer c.connMtx.RUnlock()
|
||||
return c.conn.Write(b)
|
||||
}
|
||||
|
||||
// return original error if reconn fails
|
||||
return bytesWritten, err
|
||||
}
|
||||
|
||||
// Close stops the reconnectLoop, then closes the connection via net.udpConn 's implementation
|
||||
func (c *reconnectingUDPConn) Close() error {
|
||||
close(c.closeChan)
|
||||
|
||||
// acquire rw lock before closing conn to ensure calls to Write drain
|
||||
c.connMtx.Lock()
|
||||
defer c.connMtx.Unlock()
|
||||
|
||||
if c.conn != nil {
|
||||
return c.conn.Close()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetWriteBuffer defers to the net.udpConn SetWriteBuffer implementation wrapped with a RLock. if no conn is currently held
|
||||
// and SetWriteBuffer is called store bufferBytes to be set for new conns
|
||||
func (c *reconnectingUDPConn) SetWriteBuffer(bytes int) error {
|
||||
var err error
|
||||
|
||||
c.connMtx.RLock()
|
||||
if c.conn != nil {
|
||||
err = c.conn.SetWriteBuffer(bytes)
|
||||
}
|
||||
c.connMtx.RUnlock()
|
||||
|
||||
if err == nil {
|
||||
atomic.StoreInt64(&c.bufferBytes, int64(bytes))
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
149
vendor/github.com/uber/jaeger-client-go/utils/udp_client.go
generated
vendored
149
vendor/github.com/uber/jaeger-client-go/utils/udp_client.go
generated
vendored
@@ -1,149 +0,0 @@
|
||||
// Copyright (c) 2017 Uber Technologies, Inc.
|
||||
//
|
||||
// Licensed 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 utils
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/uber/jaeger-client-go/log"
|
||||
"github.com/uber/jaeger-client-go/thrift"
|
||||
|
||||
"github.com/uber/jaeger-client-go/thrift-gen/agent"
|
||||
"github.com/uber/jaeger-client-go/thrift-gen/jaeger"
|
||||
"github.com/uber/jaeger-client-go/thrift-gen/zipkincore"
|
||||
)
|
||||
|
||||
// UDPPacketMaxLength is the max size of UDP packet we want to send, synced with jaeger-agent
|
||||
const UDPPacketMaxLength = 65000
|
||||
|
||||
// AgentClientUDP is a UDP client to Jaeger agent that implements agent.Agent interface.
|
||||
type AgentClientUDP struct {
|
||||
agent.Agent
|
||||
io.Closer
|
||||
|
||||
connUDP udpConn
|
||||
client *agent.AgentClient
|
||||
maxPacketSize int // max size of datagram in bytes
|
||||
thriftBuffer *thrift.TMemoryBuffer // buffer used to calculate byte size of a span
|
||||
}
|
||||
|
||||
type udpConn interface {
|
||||
Write([]byte) (int, error)
|
||||
SetWriteBuffer(int) error
|
||||
Close() error
|
||||
}
|
||||
|
||||
// AgentClientUDPParams allows specifying options for initializing an AgentClientUDP. An instance of this struct should
|
||||
// be passed to NewAgentClientUDPWithParams.
|
||||
type AgentClientUDPParams struct {
|
||||
HostPort string
|
||||
MaxPacketSize int
|
||||
Logger log.Logger
|
||||
DisableAttemptReconnecting bool
|
||||
AttemptReconnectInterval time.Duration
|
||||
}
|
||||
|
||||
// NewAgentClientUDPWithParams creates a client that sends spans to Jaeger Agent over UDP.
|
||||
func NewAgentClientUDPWithParams(params AgentClientUDPParams) (*AgentClientUDP, error) {
|
||||
// validate hostport
|
||||
if _, _, err := net.SplitHostPort(params.HostPort); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if params.MaxPacketSize == 0 {
|
||||
params.MaxPacketSize = UDPPacketMaxLength
|
||||
}
|
||||
|
||||
if params.Logger == nil {
|
||||
params.Logger = log.StdLogger
|
||||
}
|
||||
|
||||
if !params.DisableAttemptReconnecting && params.AttemptReconnectInterval == 0 {
|
||||
params.AttemptReconnectInterval = time.Second * 30
|
||||
}
|
||||
|
||||
thriftBuffer := thrift.NewTMemoryBufferLen(params.MaxPacketSize)
|
||||
protocolFactory := thrift.NewTCompactProtocolFactory()
|
||||
client := agent.NewAgentClientFactory(thriftBuffer, protocolFactory)
|
||||
|
||||
var connUDP udpConn
|
||||
var err error
|
||||
|
||||
if params.DisableAttemptReconnecting {
|
||||
destAddr, err := net.ResolveUDPAddr("udp", params.HostPort)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
connUDP, err = net.DialUDP(destAddr.Network(), nil, destAddr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
// host is hostname, setup resolver loop in case host record changes during operation
|
||||
connUDP, err = newReconnectingUDPConn(params.HostPort, params.AttemptReconnectInterval, net.ResolveUDPAddr, net.DialUDP, params.Logger)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if err := connUDP.SetWriteBuffer(params.MaxPacketSize); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &AgentClientUDP{
|
||||
connUDP: connUDP,
|
||||
client: client,
|
||||
maxPacketSize: params.MaxPacketSize,
|
||||
thriftBuffer: thriftBuffer,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// NewAgentClientUDP creates a client that sends spans to Jaeger Agent over UDP.
|
||||
func NewAgentClientUDP(hostPort string, maxPacketSize int) (*AgentClientUDP, error) {
|
||||
return NewAgentClientUDPWithParams(AgentClientUDPParams{
|
||||
HostPort: hostPort,
|
||||
MaxPacketSize: maxPacketSize,
|
||||
})
|
||||
}
|
||||
|
||||
// EmitZipkinBatch implements EmitZipkinBatch() of Agent interface
|
||||
func (a *AgentClientUDP) EmitZipkinBatch(spans []*zipkincore.Span) error {
|
||||
return errors.New("Not implemented")
|
||||
}
|
||||
|
||||
// EmitBatch implements EmitBatch() of Agent interface
|
||||
func (a *AgentClientUDP) EmitBatch(batch *jaeger.Batch) error {
|
||||
a.thriftBuffer.Reset()
|
||||
a.client.SeqId = 0 // we have no need for distinct SeqIds for our one-way UDP messages
|
||||
if err := a.client.EmitBatch(batch); err != nil {
|
||||
return err
|
||||
}
|
||||
if a.thriftBuffer.Len() > a.maxPacketSize {
|
||||
return fmt.Errorf("data does not fit within one UDP packet; size %d, max %d, spans %d",
|
||||
a.thriftBuffer.Len(), a.maxPacketSize, len(batch.Spans))
|
||||
}
|
||||
_, err := a.connUDP.Write(a.thriftBuffer.Bytes())
|
||||
return err
|
||||
}
|
||||
|
||||
// Close implements Close() of io.Closer and closes the underlying UDP connection.
|
||||
func (a *AgentClientUDP) Close() error {
|
||||
return a.connUDP.Close()
|
||||
}
|
87
vendor/github.com/uber/jaeger-client-go/utils/utils.go
generated
vendored
87
vendor/github.com/uber/jaeger-client-go/utils/utils.go
generated
vendored
@@ -1,87 +0,0 @@
|
||||
// Copyright (c) 2017 Uber Technologies, Inc.
|
||||
//
|
||||
// Licensed 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 utils
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"net"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
// ErrEmptyIP an error for empty ip strings
|
||||
ErrEmptyIP = errors.New("empty string given for ip")
|
||||
|
||||
// ErrNotHostColonPort an error for invalid host port string
|
||||
ErrNotHostColonPort = errors.New("expecting host:port")
|
||||
|
||||
// ErrNotFourOctets an error for the wrong number of octets after splitting a string
|
||||
ErrNotFourOctets = errors.New("Wrong number of octets")
|
||||
)
|
||||
|
||||
// ParseIPToUint32 converts a string ip (e.g. "x.y.z.w") to an uint32
|
||||
func ParseIPToUint32(ip string) (uint32, error) {
|
||||
if ip == "" {
|
||||
return 0, ErrEmptyIP
|
||||
}
|
||||
|
||||
if ip == "localhost" {
|
||||
return 127<<24 | 1, nil
|
||||
}
|
||||
|
||||
octets := strings.Split(ip, ".")
|
||||
if len(octets) != 4 {
|
||||
return 0, ErrNotFourOctets
|
||||
}
|
||||
|
||||
var intIP uint32
|
||||
for i := 0; i < 4; i++ {
|
||||
octet, err := strconv.Atoi(octets[i])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
intIP = (intIP << 8) | uint32(octet)
|
||||
}
|
||||
|
||||
return intIP, nil
|
||||
}
|
||||
|
||||
// ParsePort converts port number from string to uin16
|
||||
func ParsePort(portString string) (uint16, error) {
|
||||
port, err := strconv.ParseUint(portString, 10, 16)
|
||||
return uint16(port), err
|
||||
}
|
||||
|
||||
// PackIPAsUint32 packs an IPv4 as uint32
|
||||
func PackIPAsUint32(ip net.IP) uint32 {
|
||||
if ipv4 := ip.To4(); ipv4 != nil {
|
||||
return binary.BigEndian.Uint32(ipv4)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// TimeToMicrosecondsSinceEpochInt64 converts Go time.Time to a long
|
||||
// representing time since epoch in microseconds, which is used expected
|
||||
// in the Jaeger spans encoded as Thrift.
|
||||
func TimeToMicrosecondsSinceEpochInt64(t time.Time) int64 {
|
||||
// ^^^ Passing time.Time by value is faster than passing a pointer!
|
||||
// BenchmarkTimeByValue-8 2000000000 1.37 ns/op
|
||||
// BenchmarkTimeByPtr-8 2000000000 1.98 ns/op
|
||||
|
||||
return t.UnixNano() / 1000
|
||||
}
|
Reference in New Issue
Block a user