当前位置: 首页 > news >正文

网站留言模块怎么制作一个app应用

网站留言模块,怎么制作一个app应用,浙江企业seo推广,网站要备案吗本节重点介绍 : 项目要求 通过remote read读取prometheus中的数据通过remote write向prometheus中写入数据 准备工作 新建项目 prome_remote_read_write设计prometheus 数据源的结构初始化 项目要求 通过remote read读取prometheus中的数据通过remote write向prometheus中写…本节重点介绍 : 项目要求 通过remote read读取prometheus中的数据通过remote write向prometheus中写入数据 准备工作 新建项目 prome_remote_read_write设计prometheus 数据源的结构初始化 项目要求 通过remote read读取prometheus中的数据通过remote write向prometheus中写入数据 准备工作 新建项目 prome_remote_read_write go mod init prome_remote_read_write准备配置文件 prome_remote_read_write.yml remoteWrite代表 支持remote_write的多个后端remoteRead代表 支持remote_read的多个后端 remoteWrite:# m3db的配置#- name: m3db01# url: http://localhost:7201/api/v1/prom/remote/write# remoteTimeoutSecond: 5# prometheus的配置- name: prome01url: http://172.20.70.205:9090/api/v1/writeremoteTimeoutSecond: 5 remoteRead:- name: prome01url: http://172.20.70.205:9090/api/v1/readremoteTimeoutSecond: 5配置文件解析 config/config.go package configimport (github.com/toolkits/pkg/loggergopkg.in/yaml.v2io/ioutil )type RemoteConfig struct {Name string yaml:nameUrl string yaml:urlRemoteTimeoutSecond int yaml:remoteTimeoutSecond }type PromeSection struct {RemoteWrite []RemoteConfig yaml:remoteWriteRemoteRead []RemoteConfig yaml:remoteRead }func Load(s string) (*PromeSection, error) {cfg : PromeSection{}err : yaml.Unmarshal([]byte(s), cfg)if err ! nil {return nil, err}return cfg, nil }func LoadFile(filename string) (*PromeSection, error) {content, err : ioutil.ReadFile(filename)if err ! nil {return nil, err}cfg, err : Load(string(content))if err ! nil {logger.Errorf([parsing YAML file errr...][error:%v], err)return nil, err}return cfg, nil } main.go中解析配置 package mainimport (flaggithub.com/toolkits/pkg/loggermath/randprome_remote_read_write/configprome_remote_read_write/datasourcetime )func main() {rand.Seed(time.Now().UnixNano())configFile : flag.String(config, prome_remote_read_write.yml,Address on which to expose metrics and web interface.)flag.Parse()sConfig, err : config.LoadFile(*configFile)if err ! nil {logger.Infof(config.LoadFile Error,Exiting ...error:%v, err)return} }设计prometheus 数据源的结构 位置 datasource/prome.go package datasourceimport (github.com/go-kit/kit/loggithub.com/prometheus/client_golang/prometheusconfig_util github.com/prometheus/common/configgithub.com/prometheus/common/modelgithub.com/prometheus/common/promlogpc github.com/prometheus/prometheus/configgithub.com/prometheus/prometheus/prompbgithub.com/prometheus/prometheus/promqlgithub.com/prometheus/prometheus/storagegithub.com/prometheus/prometheus/storage/remotegithub.com/toolkits/pkg/loggergo.uber.org/atomicio/ioutilnet/httpnet/urlprome_remote_read_write/configtime )type PromeDataSource struct {Section *config.PromeSection //配置PushQueue chan []prompb.TimeSeries // 数据推送的chanLocalTmpDir string // 本地临时目录存放queries.active文件Queryable storage.SampleAndChunkQueryable // 除了promql的查询需要后端存储如查询seriesQueryEngine *promql.Engine // promql相关查询WriteTargets []*HttpClient // remote_write写入的后端地址 }type HttpClient struct {remoteName string // Used to differentiate clients in metrics.url *url.URLClient *http.Clienttimeout time.Duration } new函数 根据传入的配置new func NewPromeDataSource(cg *config.PromeSection) *PromeDataSource {pd : PromeDataSource{Section: cg,PushQueue: make(chan []prompb.TimeSeries, 10000),}return pd }Init初始化函数 完整代码如下 type safePromQLNoStepSubqueryInterval struct {value atomic.Int64 }func durationToInt64Millis(d time.Duration) int64 {return int64(d / time.Millisecond) } func (i *safePromQLNoStepSubqueryInterval) Set(ev model.Duration) {i.value.Store(durationToInt64Millis(time.Duration(ev))) } func (i *safePromQLNoStepSubqueryInterval) Get(int64) int64 {return i.value.Load() }func NewPromeDataSource(cg *config.PromeSection) *PromeDataSource {pd : PromeDataSource{Section: cg,PushQueue: make(chan []prompb.TimeSeries, 10000),}return pd }func (pd *PromeDataSource) Init() {// 模拟创建本地存储目录dbDir, err : ioutil.TempDir(, tsdb-api-ready)if err ! nil {logger.Errorf([error_create_local_tsdb_dir][err: %v], err)return}pd.LocalTmpDir dbDirpromlogConfig : promlog.Config{}// 使用本地目录创建remote-storageremoteS : remote.NewStorage(promlog.New(promlogConfig), prometheus.DefaultRegisterer, func() (int64, error) {return 0, nil}, dbDir, 1*time.Minute, nil)// ApplyConfig 加载queryablesremoteReadC : make([]*pc.RemoteReadConfig, 0)for _, u : range pd.Section.RemoteRead {ur, err : url.Parse(u.Url)if err ! nil {logger.Errorf([prome_ds_init_error][parse_url_error][url:%v][err:%v], u.Url, err)continue}remoteReadC append(remoteReadC,pc.RemoteReadConfig{URL: config_util.URL{URL: ur},RemoteTimeout: model.Duration(time.Duration(u.RemoteTimeoutSecond) * time.Second),ReadRecent: true,},)}if len(remoteReadC) 0 {logger.Errorf([prome_ds_error_got_zero_remote_read_storage])return}err remoteS.ApplyConfig(pc.Config{RemoteReadConfigs: remoteReadC})if err ! nil {logger.Errorf([error_load_remote_read_config][err: %v], err)return}pLogger : log.NewNopLogger()noStepSubqueryInterval : safePromQLNoStepSubqueryInterval{}queryQueueDir, err : ioutil.TempDir(dbDir, prom_query_concurrency)opts : promql.EngineOpts{Logger: log.With(pLogger, component, query engine),Reg: prometheus.DefaultRegisterer,MaxSamples: 50000000,Timeout: 30 * time.Second,ActiveQueryTracker: promql.NewActiveQueryTracker(queryQueueDir, 20, log.With(pLogger, component, activeQueryTracker)),LookbackDelta: 5 * time.Minute,NoStepSubqueryIntervalFn: noStepSubqueryInterval.Get,EnableAtModifier: true,}queryEngine : promql.NewEngine(opts)pd.QueryEngine queryEnginepd.Queryable remoteS// 初始化writeClientsif len(pd.Section.RemoteWrite) 0 {logger.Warningf([prome_ds_init_with_zero_RemoteWrite_target])logger.Infof([successfully_init_prometheus_datasource][remote_read_num:%v][remote_write_num:%v],len(pd.Section.RemoteRead),len(pd.Section.RemoteWrite),)return}writeTs : make([]*HttpClient, 0)for _, u : range pd.Section.RemoteWrite {ur, err : url.Parse(u.Url)if err ! nil {logger.Errorf([prome_ds_init_error][parse_url_error][url:%v][err:%v], u.Url, err)continue}writeTs append(writeTs,HttpClient{remoteName: u.Name,url: ur,Client: http.Client{},timeout: time.Duration(u.RemoteTimeoutSecond) * time.Second,})}pd.WriteTargets writeTs// 开启prometheus 队列消费协程go pd.remoteWrite()logger.Infof([successfully_init_prometheus_datasource][remote_read_num:%v][remote_write_num:%v],len(remoteReadC),len(writeTs),) } 创建本地存储目录和remote-storage 模拟创建本地存储目录 // 模拟创建本地存储目录dbDir, err : ioutil.TempDir(, tsdb-api-ready)if err ! nil {logger.Errorf([error_create_local_tsdb_dir][err: %v], err)return}pd.LocalTmpDir dbDir使用本地目录创建remote-storage // 使用本地目录创建remote-storageremoteS : remote.NewStorage(promlog.New(promlogConfig), prometheus.DefaultRegisterer, func() (int64, error) {return 0, nil}, dbDir, 1*time.Minute, nil)创建remote_read对象 遍历配置中的remote_read构造RemoteReadConfig使用RemoteReadConfig.ApplyConfig 生效配置 // ApplyConfig 加载queryablesremoteReadC : make([]*pc.RemoteReadConfig, 0)for _, u : range pd.Section.RemoteRead {ur, err : url.Parse(u.Url)if err ! nil {logger.Errorf([prome_ds_init_error][parse_url_error][url:%v][err:%v], u.Url, err)continue}remoteReadC append(remoteReadC,pc.RemoteReadConfig{URL: config_util.URL{URL: ur},RemoteTimeout: model.Duration(time.Duration(u.RemoteTimeoutSecond) * time.Second),ReadRecent: true,},)}if len(remoteReadC) 0 {logger.Errorf([prome_ds_error_got_zero_remote_read_storage])return}err remoteS.ApplyConfig(pc.Config{RemoteReadConfigs: remoteReadC})if err ! nil {logger.Errorf([error_load_remote_read_config][err: %v], err)return}创建QueryEngine并赋值 noStepSubqueryInterval : safePromQLNoStepSubqueryInterval{}queryQueueDir, err : ioutil.TempDir(dbDir, prom_query_concurrency)opts : promql.EngineOpts{Logger: log.With(pLogger, component, query engine),Reg: prometheus.DefaultRegisterer,MaxSamples: 50000000,Timeout: 30 * time.Second,ActiveQueryTracker: promql.NewActiveQueryTracker(queryQueueDir, 20, log.With(pLogger, component, activeQueryTracker)),LookbackDelta: 5 * time.Minute,NoStepSubqueryIntervalFn: noStepSubqueryInterval.Get,EnableAtModifier: true,}queryEngine : promql.NewEngine(opts)pd.QueryEngine queryEnginepd.Queryable remoteS初始化writeClients创建RemoteWrite对象 遍历RemoteWrite配置创建开启prometheus 队列消费协程 // 初始化writeClientsif len(pd.Section.RemoteWrite) 0 {logger.Warningf([prome_ds_init_with_zero_RemoteWrite_target])logger.Infof([successfully_init_prometheus_datasource][remote_read_num:%v][remote_write_num:%v],len(pd.Section.RemoteRead),len(pd.Section.RemoteWrite),)return}writeTs : make([]*HttpClient, 0)for _, u : range pd.Section.RemoteWrite {ur, err : url.Parse(u.Url)if err ! nil {logger.Errorf([prome_ds_init_error][parse_url_error][url:%v][err:%v], u.Url, err)continue}writeTs append(writeTs,HttpClient{remoteName: u.Name,url: ur,Client: http.Client{},timeout: time.Duration(u.RemoteTimeoutSecond) * time.Second,})}pd.WriteTargets writeTs// 开启prometheus 队列消费协程go pd.remoteWrite()logger.Infof([successfully_init_prometheus_datasource][remote_read_num:%v][remote_write_num:%v],len(remoteReadC),len(writeTs),)本节重点总结 : 项目要求 通过remote read读取prometheus中的数据通过remote write向prometheus中写入数据 准备工作 新建项目 prome_remote_read_write设计prometheus 数据源的结构初始化
http://www.laogonggong.com/news/123402.html

相关文章:

  • 临沂网站临沂网站制作wordpress 配置网络
  • 建网站源码建站详解网站访问量 显示代码
  • 可以做产品设计网站软件工程师发展前景
  • 溧阳住房和城乡建设局网站线上推广渠道主要有哪些
  • 做视频的网站带模板滕州 网站 建设
  • 知名网站域名方庄网站建设公司
  • 怎么做有数据库的网站网站内容作弊的形式
  • 宜宾做网站wordpress+仿站步骤
  • 网站建设公司哪家强什么叫网站建设
  • 宝钢工程建设有限公司网站百度有什么办法刷排名
  • 中国移动门户网站黄页app
  • 移动网站建设规定品牌建设之道
  • 青州网站建设优化排名网站关键词百度首页消失
  • 游戏下载网站模板互联网公司排名100强营收多少
  • 寒亭网站建设青岛网站建设公司排行
  • 电子商务网站建设实例做视频网站要什么软件有哪些
  • 潍坊建公司网站WordPress查看用户信息
  • 怎么做 废旧回收网站桂林北站到桂林站多远
  • 学会建设网站必要性比价网站 源码
  • 表单大师 做网站微信公众号和微网站
  • 设计型网站案例服装设计学校排名
  • 暖色调网站欣赏功能网站模板
  • 博客网站登录国外网页模板
  • 网站恶意刷新网站的营销方案
  • 酒类网站建设方案案专业机械设计公司
  • 做网站推广的销售怎么打电话网页的制作方法
  • 河北 石家庄 网站建设怎么做网站注册的网页
  • app混合开发框架哪个好广州网站运营专业乐云seo
  • 普通高等学校健康驿站建设指引好的网站建设案例
  • 嵌入式软件工程师培训网站改版优化