国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

k8s與審計(jì)-- 將clickhouse增加為 heapster sink

edagarli / 1322人閱讀

摘要:前言在資源審計(jì)和計(jì)費(fèi)這塊,容器和虛機(jī)有很大區(qū)別。支持諸多輸出,稱為。所以本文主要講如何為增加。實(shí)際上,基于增加并且更改,也可以做到,只不過(guò)需要裝一些包指令,結(jié)果就是鏡像變大。實(shí)際運(yùn)行日志截圖由于的出色的寫(xiě)入性能,運(yùn)行非常穩(wěn)定。

前言

在k8s資源審計(jì)和計(jì)費(fèi)這塊,容器和虛機(jī)有很大區(qū)別。相對(duì)虛機(jī)來(lái)講,容器不容易實(shí)現(xiàn)。
資源指標(biāo)收集可以采用heapster,也可以用prometheus。之前文章有介紹過(guò),prometheus的存儲(chǔ)的瓶頸和查詢較大數(shù)據(jù)量,容易o(hù)om這兩個(gè)問(wèn)題。所以選擇了heapster。此外,heapster不僅內(nèi)部實(shí)現(xiàn)了很多aggregator和calculator,做了很多聚合層的工作。而采用prometheus,你需要在查詢的時(shí)候做聚合。
heapster支持諸多metrics輸出,稱為sink。目前支持的sink如下圖:

而我比較傾向于clickhouse數(shù)據(jù)庫(kù),關(guān)于clickhouse,其實(shí)前面的文章介紹過(guò)很多了。
所以本文主要講如何為heapster增加clickhouse sink。

代碼分析和實(shí)現(xiàn)

看代碼,增加一種sink還是很簡(jiǎn)單的。典型的工廠設(shè)計(jì)模式,實(shí)現(xiàn) Name,Stop,ExportData 接口方法即可。最后再提供一個(gè)初始化函數(shù),供factory調(diào)用即可。

初始化方法 NewClickhouseSink

具體代碼:

config, err := clickhouse_common.BuildConfig(uri)
    if err != nil {
        return nil, err
    }

    client, err := sql.Open("clickhouse", config.DSN)
    if err != nil {
        glog.Errorf("connecting to clickhouse: %v", err)
        return nil, err
    }

    sink := &clickhouseSink{
        c:       *config,
        client:  client,
        conChan: make(chan struct{}, config.Concurrency),
    }

    glog.Infof("created clickhouse sink with options: host:%s user:%s db:%s", config.Host, config.UserName, config.Database)
    return sink, nil

基本上就是獲取配置文件,初始化clickhouse 的client。

在factory.go 中 build方法中,加入剛剛實(shí)現(xiàn)的初始化函數(shù)

func (this *SinkFactory) Build(uri flags.Uri) (core.DataSink, error) {
    switch uri.Key {
    case "elasticsearch":
        return elasticsearch.NewElasticSearchSink(&uri.Val)
    case "gcm":
        return gcm.CreateGCMSink(&uri.Val)
    case "stackdriver":
        return stackdriver.CreateStackdriverSink(&uri.Val)
    case "statsd":
        return statsd.NewStatsdSink(&uri.Val)
    case "graphite":
        return graphite.NewGraphiteSink(&uri.Val)
    case "hawkular":
        return hawkular.NewHawkularSink(&uri.Val)
    case "influxdb":
        return influxdb.CreateInfluxdbSink(&uri.Val)
    case "kafka":
        return kafka.NewKafkaSink(&uri.Val)
    case "librato":
        return librato.CreateLibratoSink(&uri.Val)
    case "log":
        return logsink.NewLogSink(), nil
    case "metric":
        return metricsink.NewMetricSink(140*time.Second, 15*time.Minute, []string{
            core.MetricCpuUsageRate.MetricDescriptor.Name,
            core.MetricMemoryUsage.MetricDescriptor.Name}), nil
    case "opentsdb":
        return opentsdb.CreateOpenTSDBSink(&uri.Val)
    case "wavefront":
        return wavefront.NewWavefrontSink(&uri.Val)
    case "riemann":
        return riemann.CreateRiemannSink(&uri.Val)
    case "honeycomb":
        return honeycomb.NewHoneycombSink(&uri.Val)
    case "clickhouse":
        return clickhouse.NewClickhouseSink(&uri.Val)
    default:
        return nil, fmt.Errorf("Sink not recognized: %s", uri.Key)
    }
}
Name 和 Stop
func (sink *clickhouseSink) Name() string {
    return "clickhouse"
}

func (tsdbSink *clickhouseSink) Stop() {
    // Do nothing
}

stop 函數(shù)在heapster關(guān)閉的時(shí)候調(diào)用,執(zhí)行一些非托管資源的關(guān)閉。

ExportData

這是核心的地方。

func (sink *clickhouseSink) ExportData(dataBatch *core.DataBatch) {
    sink.Lock()
    defer sink.Unlock()

    if err := sink.client.Ping(); err != nil {
        glog.Warningf("Failed to ping clickhouse: %v", err)
        return
    }

    dataPoints := make([]point, 0, 0)
    for _, metricSet := range dataBatch.MetricSets {
        for metricName, metricValue := range metricSet.MetricValues {
            var value float64
            if core.ValueInt64 == metricValue.ValueType {
                value = float64(metricValue.IntValue)
            } else if core.ValueFloat == metricValue.ValueType {
                value = float64(metricValue.FloatValue)
            } else {
                continue
            }

            pt := point{
                name:    metricName,
                cluster: sink.c.ClusterName,
                val:     value,
                ts:      dataBatch.Timestamp,
            }

            for key, value := range metricSet.Labels {
                if _, exists := clickhouseBlacklistLabels[key]; !exists {
                    if value != "" {
                        if key == "labels" {
                            lbs := strings.Split(value, ",")
                            for _, lb := range lbs {
                                ts := strings.Split(lb, ":")
                                if len(ts) == 2 && ts[0] != "" && ts[1] != "" {
                                    pt.tags = append(pt.tags, fmt.Sprintf("%s=%s", ts[0], ts[1]))
                                }
                            }
                        } else {
                            pt.tags = append(pt.tags, fmt.Sprintf("%s=%s", key, value))
                        }

                    }
                }
            }

            dataPoints = append(dataPoints, pt)
            if len(dataPoints) >= sink.c.BatchSize {
                sink.concurrentSendData(dataPoints)
                dataPoints = make([]point, 0, 0)
            }
        }
    }

    if len(dataPoints) >= 0 {
        sink.concurrentSendData(dataPoints)
    }

    sink.wg.Wait()
}

主要有以下幾個(gè)地方需要注意

數(shù)據(jù)的格式轉(zhuǎn)換。需要將heapster 中DataBatch 轉(zhuǎn)化為你目的存儲(chǔ)的格式。其實(shí)這塊做過(guò)pipeline 多output的人,很容易理解。

批量寫(xiě)入。一般在大數(shù)據(jù)量的時(shí)候,批量寫(xiě)入是一種有效的手段。

根據(jù)設(shè)置參數(shù),并發(fā)寫(xiě)入目的存儲(chǔ)。用到了golang的協(xié)程。下面這段代碼實(shí)現(xiàn)了一個(gè)協(xié)程的發(fā)送數(shù)據(jù)。

func (sink *clickhouseSink) concurrentSendData(dataPoints []point) {
    sink.wg.Add(1)
    // use the channel to block until there"s less than the maximum number of concurrent requests running
    sink.conChan <- struct{}{}
    go func(dataPoints []point) {
        sink.sendData(dataPoints)
    }(dataPoints)
}
獲取配置參數(shù)

這塊在clickhouse.go中,主要做了獲取配置參數(shù)和參數(shù)初始化一些默認(rèn)值,以及對(duì)配置參數(shù)校驗(yàn)的工作。

dockerfile的更改

原來(lái)的基礎(chǔ)鏡像是基于scratch

FROM scratch

COPY heapster eventer /
COPY ca-certificates.crt /etc/ssl/certs/

#   nobody:nobody
USER 65534:65534
ENTRYPOINT ["/heapster"]

由于需要改timezone的問(wèn)題,改成了基于alpine。

FROM alpine

RUN apk add -U tzdata
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime

COPY heapster eventer /
COPY ca-certificates.crt /etc/ssl/certs/
RUN chmod +x /heapster
ENTRYPOINT ["/heapster"]

實(shí)際上,基于scratch增加timezone并且更改,也可以做到,只不過(guò)需要裝一些包指令,結(jié)果就是鏡像變大。與其如此,不如基于我比較熟悉的alpine實(shí)現(xiàn)。

總結(jié)

fork的項(xiàng)目地址。實(shí)際運(yùn)行日志截圖:

由于ck的出色的寫(xiě)入性能,運(yùn)行非常穩(wěn)定。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/32707.html

相關(guān)文章

  • k8s審計(jì)-- clickhouse增加 heapster sink

    摘要:前言在資源審計(jì)和計(jì)費(fèi)這塊,容器和虛機(jī)有很大區(qū)別。支持諸多輸出,稱為。所以本文主要講如何為增加。實(shí)際上,基于增加并且更改,也可以做到,只不過(guò)需要裝一些包指令,結(jié)果就是鏡像變大。實(shí)際運(yùn)行日志截圖由于的出色的寫(xiě)入性能,運(yùn)行非常穩(wěn)定。 前言 在k8s資源審計(jì)和計(jì)費(fèi)這塊,容器和虛機(jī)有很大區(qū)別。相對(duì)虛機(jī)來(lái)講,容器不容易實(shí)現(xiàn)。資源指標(biāo)收集可以采用heapster,也可以用prometheus。之前文...

    tunny 評(píng)論0 收藏0
  • Kubernetes監(jiān)控之Heapster源碼分析

    摘要:源碼版本簡(jiǎn)介是下的一個(gè)監(jiān)控項(xiàng)目,用于進(jìn)行容器集群的監(jiān)控和性能分析。基本的功能及概念介紹可以回顧我之前的一篇文章監(jiān)控之介紹。在源碼分析之前我們先介紹的實(shí)現(xiàn)流程,由上圖可以看出會(huì)從各個(gè)上獲取相關(guān)的監(jiān)控信息,然后進(jìn)行匯總發(fā)送給后臺(tái)數(shù)據(jù)庫(kù)。 源碼版本 heapster version: release-1.2 簡(jiǎn)介 Heapster是Kubernetes下的一個(gè)監(jiān)控項(xiàng)目,用于進(jìn)行容器集群的監(jiān)控...

    gclove 評(píng)論0 收藏0
  • Kubernetes監(jiān)控之Heapster介紹

    摘要:在每個(gè)上都會(huì)運(yùn)行,它會(huì)收集本機(jī)以及容器的監(jiān)控?cái)?shù)據(jù)。使用這里主要介紹的使用,及可獲取的。參考資料文檔文檔及可用在官方文檔中都介紹的比較齊全。我們沒(méi)有采用該方式,是考慮到如果和監(jiān)控系統(tǒng)相互依賴,會(huì)導(dǎo)致異常之后,存在監(jiān)控系統(tǒng)無(wú)法使用的隱患。 什么是Heapster? Heapster是容器集群監(jiān)控和性能分析工具,天然的支持Kubernetes和CoreOS。Kubernetes有個(gè)出名的監(jiān)控...

    LeviDing 評(píng)論0 收藏0
  • 容器監(jiān)控實(shí)踐—Heapster

    摘要:還可以把數(shù)據(jù)導(dǎo)入到第三方工具展示或使用場(chǎng)景共同組成了一個(gè)流行的監(jiān)控解決方案原生的監(jiān)控圖表信息來(lái)自在中也用到了,將作為,向其獲取,作為水平擴(kuò)縮容的監(jiān)控依據(jù)監(jiān)控指標(biāo)流程首先從獲取集群中所有的信息。 概述 該項(xiàng)目將被廢棄(RETIRED) Heapster是Kubernetes旗下的一個(gè)項(xiàng)目,Heapster是一個(gè)收集者,并不是采集 1.Heapster可以收集Node節(jié)點(diǎn)上的cAdvis...

    DDreach 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<