influxdb
This commit is contained in:
		
							parent
							
								
									4dba9b162c
								
							
						
					
					
						commit
						bc9c6c5ce3
					
				| 
						 | 
				
			
			@ -3,8 +3,8 @@ package adapi
 | 
			
		|||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/smbrave/gosdk/util"
 | 
			
		||||
	"github.com/spf13/cast"
 | 
			
		||||
	"gitlab.batiao8.com/open/gosdk/util"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,7 @@ package adminapi
 | 
			
		|||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/smbrave/gosdk/util"
 | 
			
		||||
	"gitlab.batiao8.com/open/gosdk/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Application struct {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,7 @@ package adminapi
 | 
			
		|||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/smbrave/gosdk/util"
 | 
			
		||||
	"gitlab.batiao8.com/open/gosdk/util"
 | 
			
		||||
	"net/url"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										7
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										7
									
								
								go.mod
								
								
								
								
							| 
						 | 
				
			
			@ -1,5 +1,8 @@
 | 
			
		|||
module github.com/smbrave/gosdk
 | 
			
		||||
module gitlab.batiao8.com/open/gosdk
 | 
			
		||||
 | 
			
		||||
go 1.18
 | 
			
		||||
 | 
			
		||||
require github.com/spf13/cast v1.5.0
 | 
			
		||||
require (
 | 
			
		||||
	github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c
 | 
			
		||||
	github.com/spf13/cast v1.5.0
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,13 +1,14 @@
 | 
			
		|||
package metric
 | 
			
		||||
 | 
			
		||||
import "os"
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	serv *service
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Config struct {
 | 
			
		||||
	Address  string
 | 
			
		||||
	Username string
 | 
			
		||||
	Password string
 | 
			
		||||
	Database string
 | 
			
		||||
	Interval int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -23,12 +24,16 @@ func Init(c *Config) error {
 | 
			
		|||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	hostname, _ := os.Hostname()
 | 
			
		||||
	serv = &service{
 | 
			
		||||
		config:   c,
 | 
			
		||||
		hostname: hostname,
 | 
			
		||||
		metrics:  make(chan *metric, 100000),
 | 
			
		||||
	}
 | 
			
		||||
	serv = NewService(c)
 | 
			
		||||
	go serv.run()
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Config) Default() {
 | 
			
		||||
	if c.Database == "" {
 | 
			
		||||
		c.Database = "telegraf"
 | 
			
		||||
	}
 | 
			
		||||
	if c.Interval == 0 {
 | 
			
		||||
		c.Interval = 10
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,10 +8,11 @@ import (
 | 
			
		|||
 | 
			
		||||
func TestName(t *testing.T) {
 | 
			
		||||
	c := NewConfg()
 | 
			
		||||
	c.Address = "https://monitor.batiao8.com"
 | 
			
		||||
	c.Address = "http://14.22.116.197:9305"
 | 
			
		||||
	c.Interval = 1
 | 
			
		||||
	Init(c)
 | 
			
		||||
	for i := 0; i < 100; i++ {
 | 
			
		||||
		Metric("test", float64(rand.Int()%100), map[string]string{
 | 
			
		||||
		Metric("test.test.b", float64(rand.Int()%100), map[string]string{
 | 
			
		||||
			"a": "b",
 | 
			
		||||
			"c": "d",
 | 
			
		||||
		})
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,13 +1,10 @@
 | 
			
		|||
package metric
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/spf13/cast"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	influxdb "github.com/influxdata/influxdb1-client"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"os"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
| 
						 | 
				
			
			@ -21,10 +18,37 @@ type metric struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
type service struct {
 | 
			
		||||
	hostname string
 | 
			
		||||
	metrics  chan *metric
 | 
			
		||||
	megers   map[string]*metric
 | 
			
		||||
	config   *Config
 | 
			
		||||
	hostname    string
 | 
			
		||||
	serviceName string
 | 
			
		||||
	hostIp      string
 | 
			
		||||
	podIp       string
 | 
			
		||||
	metrics     chan *metric
 | 
			
		||||
	megers      map[string]*metric
 | 
			
		||||
	config      *Config
 | 
			
		||||
	client      *influxdb.Client
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewService(c *Config) *service {
 | 
			
		||||
	c.Default()
 | 
			
		||||
	hostname, _ := os.Hostname()
 | 
			
		||||
 | 
			
		||||
	infUrl, _ := url.Parse(c.Address)
 | 
			
		||||
	infCfg := influxdb.NewConfig()
 | 
			
		||||
	infCfg.Username = c.Username
 | 
			
		||||
	infCfg.Password = c.Password
 | 
			
		||||
	infCfg.URL = *infUrl
 | 
			
		||||
 | 
			
		||||
	client, _ := influxdb.NewClient(infCfg)
 | 
			
		||||
 | 
			
		||||
	return &service{
 | 
			
		||||
		metrics:     make(chan *metric, 100000),
 | 
			
		||||
		hostname:    hostname,
 | 
			
		||||
		serviceName: os.Getenv("SERVICE_NAME"),
 | 
			
		||||
		podIp:       os.Getenv("POD_IP"),
 | 
			
		||||
		hostIp:      os.Getenv("HOST_IP"),
 | 
			
		||||
		config:      c,
 | 
			
		||||
		client:      client,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *service) run() {
 | 
			
		||||
| 
						 | 
				
			
			@ -66,51 +90,39 @@ func (s *service) process(m *metric) {
 | 
			
		|||
	s.megers[key] = m
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *service) defaultTags(tags map[string]string) map[string]string {
 | 
			
		||||
	if tags == nil {
 | 
			
		||||
		tags = map[string]string{
 | 
			
		||||
			"hostname": s.hostname,
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		tags["hostname"] = s.hostname
 | 
			
		||||
func (s *service) defaultTags() map[string]string {
 | 
			
		||||
 | 
			
		||||
	return map[string]string{
 | 
			
		||||
		"hostname":     s.hostname,
 | 
			
		||||
		"host_ip":      s.hostIp,
 | 
			
		||||
		"pod_ip":       s.podIp,
 | 
			
		||||
		"service_name": s.serviceName,
 | 
			
		||||
	}
 | 
			
		||||
	return tags
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *service) report() {
 | 
			
		||||
	if s.megers == nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	metrics := make([]*metric, 0)
 | 
			
		||||
 | 
			
		||||
	var bp influxdb.BatchPoints
 | 
			
		||||
	for _, v := range s.megers {
 | 
			
		||||
		v.Tags = s.defaultTags(v.Tags)
 | 
			
		||||
		metrics = append(metrics, v)
 | 
			
		||||
	}
 | 
			
		||||
	reqUrl := fmt.Sprintf("%s/opentsdb/put", serv.config.Address)
 | 
			
		||||
 | 
			
		||||
	reqBody, _ := json.Marshal(metrics)
 | 
			
		||||
	resp, err := http.Post(reqUrl, "application/json", bytes.NewBuffer(reqBody))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Printf("http.Post error :%s", err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	defer resp.Body.Close()
 | 
			
		||||
	rspBody, err := ioutil.ReadAll(resp.Body)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Printf(" ioutil.ReadAll error :%s", err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	result := make(map[string]interface{})
 | 
			
		||||
	if err := json.Unmarshal(rspBody, &result); err != nil {
 | 
			
		||||
		log.Printf("json result : %s", string(rspBody))
 | 
			
		||||
		return
 | 
			
		||||
		var p influxdb.Point
 | 
			
		||||
		p.Measurement = v.Metric
 | 
			
		||||
		p.Tags = v.Tags
 | 
			
		||||
		p.Fields = map[string]interface{}{
 | 
			
		||||
			"value": v.Value,
 | 
			
		||||
		}
 | 
			
		||||
		p.Time = time.Unix(v.Timestamp, 0)
 | 
			
		||||
		bp.Points = append(bp.Points, p)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fail := cast.ToInt(result["fail"])
 | 
			
		||||
	if fail != 0 {
 | 
			
		||||
		log.Printf("http result : %s", string(rspBody))
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	bp.Database = s.config.Database
 | 
			
		||||
	bp.Tags = s.defaultTags()
 | 
			
		||||
 | 
			
		||||
	s.client.Write(bp)
 | 
			
		||||
	fmt.Println("ok write")
 | 
			
		||||
	s.megers = nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,7 @@ import (
 | 
			
		|||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/smbrave/gosdk/util"
 | 
			
		||||
	"gitlab.batiao8.com/open/gosdk/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue