Best Gauge code snippet using gauge.addRows
main.go
Source:main.go
1package vmstorage2import (3 "flag"4 "fmt"5 "net/http"6 "strings"7 "sync"8 "time"9 "github.com/VictoriaMetrics/VictoriaMetrics/lib/encoding"10 "github.com/VictoriaMetrics/VictoriaMetrics/lib/fasttime"11 "github.com/VictoriaMetrics/VictoriaMetrics/lib/fs"12 "github.com/VictoriaMetrics/VictoriaMetrics/lib/httpserver"13 "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger"14 "github.com/VictoriaMetrics/VictoriaMetrics/lib/storage"15 "github.com/VictoriaMetrics/VictoriaMetrics/lib/syncwg"16 "github.com/VictoriaMetrics/metrics"17)18var (19 retentionPeriod = flag.Int("retentionPeriod", 1, "Retention period in months")20 snapshotAuthKey = flag.String("snapshotAuthKey", "", "authKey, which must be passed in query string to /snapshot* pages")21 precisionBits = flag.Int("precisionBits", 64, "The number of precision bits to store per each value. Lower precision bits improves data compression at the cost of precision loss")22 // DataPath is a path to storage data.23 DataPath = flag.String("storageDataPath", "victoria-metrics-data", "Path to storage data")24 bigMergeConcurrency = flag.Int("bigMergeConcurrency", 0, "The maximum number of CPU cores to use for big merges. Default value is used if set to 0")25 smallMergeConcurrency = flag.Int("smallMergeConcurrency", 0, "The maximum number of CPU cores to use for small merges. Default value is used if set to 0")26 denyQueriesOutsideRetention = flag.Bool("denyQueriesOutsideRetention", false, "Whether to deny queries outside of the configured -retentionPeriod. "+27 "When set, then /api/v1/query_range would return '503 Service Unavailable' error for queries with 'from' value outside -retentionPeriod. "+28 "This may be useful when multiple data sources with distinct retentions are hidden behind query-tee")29)30// CheckTimeRange returns true if the given tr is denied for querying.31func CheckTimeRange(tr storage.TimeRange) error {32 if !*denyQueriesOutsideRetention {33 return nil34 }35 minAllowedTimestamp := (int64(fasttime.UnixTimestamp()) - int64(*retentionPeriod)*3600*24*30) * 100036 if tr.MinTimestamp > minAllowedTimestamp {37 return nil38 }39 return &httpserver.ErrorWithStatusCode{40 Err: fmt.Errorf("the given time range %s is outside the allowed retention of %d months according to -denyQueriesOutsideRetention", &tr, *retentionPeriod),41 StatusCode: http.StatusServiceUnavailable,42 }43}44// Init initializes vmstorage.45func Init() {46 InitWithoutMetrics()47 registerStorageMetrics()48}49// InitWithoutMetrics must be called instead of Init inside tests.50//51// This allows multiple Init / Stop cycles.52func InitWithoutMetrics() {53 if err := encoding.CheckPrecisionBits(uint8(*precisionBits)); err != nil {54 logger.Fatalf("invalid `-precisionBits`: %s", err)55 }56 storage.SetBigMergeWorkersCount(*bigMergeConcurrency)57 storage.SetSmallMergeWorkersCount(*smallMergeConcurrency)58 logger.Infof("opening storage at %q with retention period %d months", *DataPath, *retentionPeriod)59 startTime := time.Now()60 WG = syncwg.WaitGroup{}61 strg, err := storage.OpenStorage(*DataPath, *retentionPeriod)62 if err != nil {63 logger.Fatalf("cannot open a storage at %s with retention period %d months: %s", *DataPath, *retentionPeriod, err)64 }65 Storage = strg66 var m storage.Metrics67 Storage.UpdateMetrics(&m)68 tm := &m.TableMetrics69 partsCount := tm.SmallPartsCount + tm.BigPartsCount70 blocksCount := tm.SmallBlocksCount + tm.BigBlocksCount71 rowsCount := tm.SmallRowsCount + tm.BigRowsCount72 sizeBytes := tm.SmallSizeBytes + tm.BigSizeBytes73 logger.Infof("successfully opened storage %q in %.3f seconds; partsCount: %d; blocksCount: %d; rowsCount: %d; sizeBytes: %d",74 *DataPath, time.Since(startTime).Seconds(), partsCount, blocksCount, rowsCount, sizeBytes)75}76// Storage is a storage.77//78// Every storage call must be wrapped into WG.Add(1) ... WG.Done()79// for proper graceful shutdown when Stop is called.80var Storage *storage.Storage81// WG must be incremented before Storage call.82//83// Use syncwg instead of sync, since Add is called from concurrent goroutines.84var WG syncwg.WaitGroup85// AddRows adds mrs to the storage.86func AddRows(mrs []storage.MetricRow) error {87 WG.Add(1)88 err := Storage.AddRows(mrs, uint8(*precisionBits))89 WG.Done()90 return err91}92// DeleteMetrics deletes metrics matching tfss.93//94// Returns the number of deleted metrics.95func DeleteMetrics(tfss []*storage.TagFilters) (int, error) {96 WG.Add(1)97 n, err := Storage.DeleteMetrics(tfss)98 WG.Done()99 return n, err100}101// SearchTagKeys searches for tag keys102func SearchTagKeys(maxTagKeys int) ([]string, error) {103 WG.Add(1)104 keys, err := Storage.SearchTagKeys(maxTagKeys)105 WG.Done()106 return keys, err107}108// SearchTagValues searches for tag values for the given tagKey109func SearchTagValues(tagKey []byte, maxTagValues int) ([]string, error) {110 WG.Add(1)111 values, err := Storage.SearchTagValues(tagKey, maxTagValues)112 WG.Done()113 return values, err114}115// SearchTagEntries searches for tag entries.116func SearchTagEntries(maxTagKeys, maxTagValues int) ([]storage.TagEntry, error) {117 WG.Add(1)118 tagEntries, err := Storage.SearchTagEntries(maxTagKeys, maxTagValues)119 WG.Done()120 return tagEntries, err121}122// GetTSDBStatusForDate returns TSDB status for the given date.123func GetTSDBStatusForDate(date uint64, topN int) (*storage.TSDBStatus, error) {124 WG.Add(1)125 status, err := Storage.GetTSDBStatusForDate(date, topN)126 WG.Done()127 return status, err128}129// GetSeriesCount returns the number of time series in the storage.130func GetSeriesCount() (uint64, error) {131 WG.Add(1)132 n, err := Storage.GetSeriesCount()133 WG.Done()134 return n, err135}136// Stop stops the vmstorage137func Stop() {138 logger.Infof("gracefully closing the storage at %s", *DataPath)139 startTime := time.Now()140 WG.WaitAndBlock()141 Storage.MustClose()142 logger.Infof("successfully closed the storage in %.3f seconds", time.Since(startTime).Seconds())143 logger.Infof("the storage has been stopped")144}145// RequestHandler is a storage request handler.146func RequestHandler(w http.ResponseWriter, r *http.Request) bool {147 path := r.URL.Path148 prometheusCompatibleResponse := false149 if path == "/api/v1/admin/tsdb/snapshot" {150 // Handle Prometheus API - https://prometheus.io/docs/prometheus/latest/querying/api/#snapshot .151 prometheusCompatibleResponse = true152 path = "/snapshot/create"153 }154 if !strings.HasPrefix(path, "/snapshot") {155 return false156 }157 authKey := r.FormValue("authKey")158 if authKey != *snapshotAuthKey {159 httpserver.Errorf(w, "invalid authKey %q. It must match the value from -snapshotAuthKey command line flag", authKey)160 return true161 }162 path = path[len("/snapshot"):]163 switch path {164 case "/create":165 w.Header().Set("Content-Type", "application/json")166 snapshotPath, err := Storage.CreateSnapshot()167 if err != nil {168 err = fmt.Errorf("cannot create snapshot: %w", err)169 jsonResponseError(w, err)170 return true171 }172 if prometheusCompatibleResponse {173 fmt.Fprintf(w, `{"status":"success","data":{"name":%q}}`, snapshotPath)174 } else {175 fmt.Fprintf(w, `{"status":"ok","snapshot":%q}`, snapshotPath)176 }177 return true178 case "/list":179 w.Header().Set("Content-Type", "application/json")180 snapshots, err := Storage.ListSnapshots()181 if err != nil {182 err = fmt.Errorf("cannot list snapshots: %w", err)183 jsonResponseError(w, err)184 return true185 }186 fmt.Fprintf(w, `{"status":"ok","snapshots":[`)187 if len(snapshots) > 0 {188 for _, snapshot := range snapshots[:len(snapshots)-1] {189 fmt.Fprintf(w, "\n%q,", snapshot)190 }191 fmt.Fprintf(w, "\n%q\n", snapshots[len(snapshots)-1])192 }193 fmt.Fprintf(w, `]}`)194 return true195 case "/delete":196 w.Header().Set("Content-Type", "application/json")197 snapshotName := r.FormValue("snapshot")198 if err := Storage.DeleteSnapshot(snapshotName); err != nil {199 err = fmt.Errorf("cannot delete snapshot %q: %w", snapshotName, err)200 jsonResponseError(w, err)201 return true202 }203 fmt.Fprintf(w, `{"status":"ok"}`)204 return true205 case "/delete_all":206 w.Header().Set("Content-Type", "application/json")207 snapshots, err := Storage.ListSnapshots()208 if err != nil {209 err = fmt.Errorf("cannot list snapshots: %w", err)210 jsonResponseError(w, err)211 return true212 }213 for _, snapshotName := range snapshots {214 if err := Storage.DeleteSnapshot(snapshotName); err != nil {215 err = fmt.Errorf("cannot delete snapshot %q: %w", snapshotName, err)216 jsonResponseError(w, err)217 return true218 }219 }220 fmt.Fprintf(w, `{"status":"ok"}`)221 return true222 default:223 return false224 }225}226func registerStorageMetrics() {227 mCache := &storage.Metrics{}228 var mCacheLock sync.Mutex229 var lastUpdateTime time.Time230 m := func() *storage.Metrics {231 mCacheLock.Lock()232 defer mCacheLock.Unlock()233 if time.Since(lastUpdateTime) < time.Second {234 return mCache235 }236 var mc storage.Metrics237 Storage.UpdateMetrics(&mc)238 mCache = &mc239 lastUpdateTime = time.Now()240 return mCache241 }242 tm := func() *storage.TableMetrics {243 sm := m()244 return &sm.TableMetrics245 }246 idbm := func() *storage.IndexDBMetrics {247 sm := m()248 return &sm.IndexDBMetrics249 }250 metrics.NewGauge(fmt.Sprintf(`vm_free_disk_space_bytes{path=%q}`, *DataPath), func() float64 {251 return float64(fs.MustGetFreeSpace(*DataPath))252 })253 metrics.NewGauge(`vm_active_merges{type="storage/big"}`, func() float64 {254 return float64(tm().ActiveBigMerges)255 })256 metrics.NewGauge(`vm_active_merges{type="storage/small"}`, func() float64 {257 return float64(tm().ActiveSmallMerges)258 })259 metrics.NewGauge(`vm_active_merges{type="indexdb"}`, func() float64 {260 return float64(idbm().ActiveMerges)261 })262 metrics.NewGauge(`vm_merges_total{type="storage/big"}`, func() float64 {263 return float64(tm().BigMergesCount)264 })265 metrics.NewGauge(`vm_merges_total{type="storage/small"}`, func() float64 {266 return float64(tm().SmallMergesCount)267 })268 metrics.NewGauge(`vm_merges_total{type="indexdb"}`, func() float64 {269 return float64(idbm().MergesCount)270 })271 metrics.NewGauge(`vm_rows_merged_total{type="storage/big"}`, func() float64 {272 return float64(tm().BigRowsMerged)273 })274 metrics.NewGauge(`vm_rows_merged_total{type="storage/small"}`, func() float64 {275 return float64(tm().SmallRowsMerged)276 })277 metrics.NewGauge(`vm_rows_merged_total{type="indexdb"}`, func() float64 {278 return float64(idbm().ItemsMerged)279 })280 metrics.NewGauge(`vm_rows_deleted_total{type="storage/big"}`, func() float64 {281 return float64(tm().BigRowsDeleted)282 })283 metrics.NewGauge(`vm_rows_deleted_total{type="storage/small"}`, func() float64 {284 return float64(tm().SmallRowsDeleted)285 })286 metrics.NewGauge(`vm_references{type="storage/big", name="parts"}`, func() float64 {287 return float64(tm().BigPartsRefCount)288 })289 metrics.NewGauge(`vm_references{type="storage/small", name="parts"}`, func() float64 {290 return float64(tm().SmallPartsRefCount)291 })292 metrics.NewGauge(`vm_references{type="storage", name="partitions"}`, func() float64 {293 return float64(tm().PartitionsRefCount)294 })295 metrics.NewGauge(`vm_references{type="indexdb", name="objects"}`, func() float64 {296 return float64(idbm().IndexDBRefCount)297 })298 metrics.NewGauge(`vm_references{type="indexdb", name="parts"}`, func() float64 {299 return float64(idbm().PartsRefCount)300 })301 metrics.NewGauge(`vm_new_timeseries_created_total`, func() float64 {302 return float64(idbm().NewTimeseriesCreated)303 })304 metrics.NewGauge(`vm_missing_tsids_for_metric_id_total`, func() float64 {305 return float64(idbm().MissingTSIDsForMetricID)306 })307 metrics.NewGauge(`vm_recent_hour_metric_ids_search_calls_total`, func() float64 {308 return float64(idbm().RecentHourMetricIDsSearchCalls)309 })310 metrics.NewGauge(`vm_recent_hour_metric_ids_search_hits_total`, func() float64 {311 return float64(idbm().RecentHourMetricIDsSearchHits)312 })313 metrics.NewGauge(`vm_date_metric_ids_search_calls_total`, func() float64 {314 return float64(idbm().DateMetricIDsSearchCalls)315 })316 metrics.NewGauge(`vm_date_metric_ids_search_hits_total`, func() float64 {317 return float64(idbm().DateMetricIDsSearchHits)318 })319 metrics.NewGauge(`vm_index_blocks_with_metric_ids_processed_total`, func() float64 {320 return float64(idbm().IndexBlocksWithMetricIDsProcessed)321 })322 metrics.NewGauge(`vm_index_blocks_with_metric_ids_incorrect_order_total`, func() float64 {323 return float64(idbm().IndexBlocksWithMetricIDsIncorrectOrder)324 })325 metrics.NewGauge(`vm_assisted_merges_total{type="storage/small"}`, func() float64 {326 return float64(tm().SmallAssistedMerges)327 })328 metrics.NewGauge(`vm_assisted_merges_total{type="indexdb"}`, func() float64 {329 return float64(idbm().AssistedMerges)330 })331 metrics.NewGauge(`vm_pending_rows{type="storage"}`, func() float64 {332 return float64(tm().PendingRows)333 })334 metrics.NewGauge(`vm_pending_rows{type="indexdb"}`, func() float64 {335 return float64(idbm().PendingItems)336 })337 metrics.NewGauge(`vm_parts{type="storage/big"}`, func() float64 {338 return float64(tm().BigPartsCount)339 })340 metrics.NewGauge(`vm_parts{type="storage/small"}`, func() float64 {341 return float64(tm().SmallPartsCount)342 })343 metrics.NewGauge(`vm_parts{type="indexdb"}`, func() float64 {344 return float64(idbm().PartsCount)345 })346 metrics.NewGauge(`vm_blocks{type="storage/big"}`, func() float64 {347 return float64(tm().BigBlocksCount)348 })349 metrics.NewGauge(`vm_blocks{type="storage/small"}`, func() float64 {350 return float64(tm().SmallBlocksCount)351 })352 metrics.NewGauge(`vm_blocks{type="indexdb"}`, func() float64 {353 return float64(idbm().BlocksCount)354 })355 metrics.NewGauge(`vm_data_size_bytes{type="storage/big"}`, func() float64 {356 return float64(tm().BigSizeBytes)357 })358 metrics.NewGauge(`vm_data_size_bytes{type="storage/small"}`, func() float64 {359 return float64(tm().SmallSizeBytes)360 })361 metrics.NewGauge(`vm_data_size_bytes{type="indexdb"}`, func() float64 {362 return float64(idbm().SizeBytes)363 })364 metrics.NewGauge(`vm_deduplicated_samples_total{type="merge"}`, func() float64 {365 return float64(m().DedupsDuringMerge)366 })367 metrics.NewGauge(`vm_rows_ignored_total{reason="big_timestamp"}`, func() float64 {368 return float64(m().TooBigTimestampRows)369 })370 metrics.NewGauge(`vm_rows_ignored_total{reason="small_timestamp"}`, func() float64 {371 return float64(m().TooSmallTimestampRows)372 })373 metrics.NewGauge(`vm_concurrent_addrows_limit_reached_total`, func() float64 {374 return float64(m().AddRowsConcurrencyLimitReached)375 })376 metrics.NewGauge(`vm_concurrent_addrows_limit_timeout_total`, func() float64 {377 return float64(m().AddRowsConcurrencyLimitTimeout)378 })379 metrics.NewGauge(`vm_concurrent_addrows_dropped_rows_total`, func() float64 {380 return float64(m().AddRowsConcurrencyDroppedRows)381 })382 metrics.NewGauge(`vm_concurrent_addrows_capacity`, func() float64 {383 return float64(m().AddRowsConcurrencyCapacity)384 })385 metrics.NewGauge(`vm_concurrent_addrows_current`, func() float64 {386 return float64(m().AddRowsConcurrencyCurrent)387 })388 metrics.NewGauge(`vm_slow_row_inserts_total`, func() float64 {389 return float64(m().SlowRowInserts)390 })391 metrics.NewGauge(`vm_slow_per_day_index_inserts_total`, func() float64 {392 return float64(m().SlowPerDayIndexInserts)393 })394 metrics.NewGauge(`vm_slow_metric_name_loads_total`, func() float64 {395 return float64(m().SlowMetricNameLoads)396 })397 metrics.NewGauge(`vm_rows{type="storage/big"}`, func() float64 {398 return float64(tm().BigRowsCount)399 })400 metrics.NewGauge(`vm_rows{type="storage/small"}`, func() float64 {401 return float64(tm().SmallRowsCount)402 })403 metrics.NewGauge(`vm_rows{type="indexdb"}`, func() float64 {404 return float64(idbm().ItemsCount)405 })406 metrics.NewGauge(`vm_date_range_search_calls_total`, func() float64 {407 return float64(idbm().DateRangeSearchCalls)408 })409 metrics.NewGauge(`vm_date_range_hits_total`, func() float64 {410 return float64(idbm().DateRangeSearchHits)411 })412 metrics.NewGauge(`vm_missing_metric_names_for_metric_id_total`, func() float64 {413 return float64(idbm().MissingMetricNamesForMetricID)414 })415 metrics.NewGauge(`vm_date_metric_id_cache_syncs_total`, func() float64 {416 return float64(m().DateMetricIDCacheSyncsCount)417 })418 metrics.NewGauge(`vm_date_metric_id_cache_resets_total`, func() float64 {419 return float64(m().DateMetricIDCacheResetsCount)420 })421 metrics.NewGauge(`vm_cache_entries{type="storage/tsid"}`, func() float64 {422 return float64(m().TSIDCacheSize)423 })424 metrics.NewGauge(`vm_cache_entries{type="storage/metricIDs"}`, func() float64 {425 return float64(m().MetricIDCacheSize)426 })427 metrics.NewGauge(`vm_cache_entries{type="storage/metricName"}`, func() float64 {428 return float64(m().MetricNameCacheSize)429 })430 metrics.NewGauge(`vm_cache_entries{type="storage/date_metricID"}`, func() float64 {431 return float64(m().DateMetricIDCacheSize)432 })433 metrics.NewGauge(`vm_cache_entries{type="storage/hour_metric_ids"}`, func() float64 {434 return float64(m().HourMetricIDCacheSize)435 })436 metrics.NewGauge(`vm_cache_entries{type="storage/next_day_metric_ids"}`, func() float64 {437 return float64(m().NextDayMetricIDCacheSize)438 })439 metrics.NewGauge(`vm_cache_entries{type="storage/bigIndexBlocks"}`, func() float64 {440 return float64(tm().BigIndexBlocksCacheSize)441 })442 metrics.NewGauge(`vm_cache_entries{type="storage/smallIndexBlocks"}`, func() float64 {443 return float64(tm().SmallIndexBlocksCacheSize)444 })445 metrics.NewGauge(`vm_cache_entries{type="indexdb/dataBlocks"}`, func() float64 {446 return float64(idbm().DataBlocksCacheSize)447 })448 metrics.NewGauge(`vm_cache_entries{type="indexdb/indexBlocks"}`, func() float64 {449 return float64(idbm().IndexBlocksCacheSize)450 })451 metrics.NewGauge(`vm_cache_entries{type="indexdb/tagFilters"}`, func() float64 {452 return float64(idbm().TagCacheSize)453 })454 metrics.NewGauge(`vm_cache_entries{type="indexdb/uselessTagFilters"}`, func() float64 {455 return float64(idbm().UselessTagFiltersCacheSize)456 })457 metrics.NewGauge(`vm_cache_entries{type="storage/regexps"}`, func() float64 {458 return float64(storage.RegexpCacheSize())459 })460 metrics.NewGauge(`vm_cache_size_entries{type="storage/prefetchedMetricIDs"}`, func() float64 {461 return float64(m().PrefetchedMetricIDsSize)462 })463 metrics.NewGauge(`vm_cache_size_bytes{type="storage/tsid"}`, func() float64 {464 return float64(m().TSIDCacheSizeBytes)465 })466 metrics.NewGauge(`vm_cache_size_bytes{type="storage/metricIDs"}`, func() float64 {467 return float64(m().MetricIDCacheSizeBytes)468 })469 metrics.NewGauge(`vm_cache_size_bytes{type="storage/metricName"}`, func() float64 {470 return float64(m().MetricNameCacheSizeBytes)471 })472 metrics.NewGauge(`vm_cache_size_bytes{type="storage/date_metricID"}`, func() float64 {473 return float64(m().DateMetricIDCacheSizeBytes)474 })475 metrics.NewGauge(`vm_cache_size_bytes{type="storage/hour_metric_ids"}`, func() float64 {476 return float64(m().HourMetricIDCacheSizeBytes)477 })478 metrics.NewGauge(`vm_cache_size_bytes{type="storage/next_day_metric_ids"}`, func() float64 {479 return float64(m().NextDayMetricIDCacheSizeBytes)480 })481 metrics.NewGauge(`vm_cache_size_bytes{type="indexdb/tagFilters"}`, func() float64 {482 return float64(idbm().TagCacheSizeBytes)483 })484 metrics.NewGauge(`vm_cache_size_bytes{type="indexdb/uselessTagFilters"}`, func() float64 {485 return float64(idbm().UselessTagFiltersCacheSizeBytes)486 })487 metrics.NewGauge(`vm_cache_size_bytes{type="storage/prefetchedMetricIDs"}`, func() float64 {488 return float64(m().PrefetchedMetricIDsSizeBytes)489 })490 metrics.NewGauge(`vm_cache_requests_total{type="storage/tsid"}`, func() float64 {491 return float64(m().TSIDCacheRequests)492 })493 metrics.NewGauge(`vm_cache_requests_total{type="storage/metricIDs"}`, func() float64 {494 return float64(m().MetricIDCacheRequests)495 })496 metrics.NewGauge(`vm_cache_requests_total{type="storage/metricName"}`, func() float64 {497 return float64(m().MetricNameCacheRequests)498 })499 metrics.NewGauge(`vm_cache_requests_total{type="storage/bigIndexBlocks"}`, func() float64 {500 return float64(tm().BigIndexBlocksCacheRequests)501 })502 metrics.NewGauge(`vm_cache_requests_total{type="storage/smallIndexBlocks"}`, func() float64 {503 return float64(tm().SmallIndexBlocksCacheRequests)504 })505 metrics.NewGauge(`vm_cache_requests_total{type="indexdb/dataBlocks"}`, func() float64 {506 return float64(idbm().DataBlocksCacheRequests)507 })508 metrics.NewGauge(`vm_cache_requests_total{type="indexdb/indexBlocks"}`, func() float64 {509 return float64(idbm().IndexBlocksCacheRequests)510 })511 metrics.NewGauge(`vm_cache_requests_total{type="indexdb/tagFilters"}`, func() float64 {512 return float64(idbm().TagCacheRequests)513 })514 metrics.NewGauge(`vm_cache_requests_total{type="indexdb/uselessTagFilters"}`, func() float64 {515 return float64(idbm().UselessTagFiltersCacheRequests)516 })517 metrics.NewGauge(`vm_cache_requests_total{type="storage/regexps"}`, func() float64 {518 return float64(storage.RegexpCacheRequests())519 })520 metrics.NewGauge(`vm_cache_misses_total{type="storage/tsid"}`, func() float64 {521 return float64(m().TSIDCacheMisses)522 })523 metrics.NewGauge(`vm_cache_misses_total{type="storage/metricIDs"}`, func() float64 {524 return float64(m().MetricIDCacheMisses)525 })526 metrics.NewGauge(`vm_cache_misses_total{type="storage/metricName"}`, func() float64 {527 return float64(m().MetricNameCacheMisses)528 })529 metrics.NewGauge(`vm_cache_misses_total{type="storage/bigIndexBlocks"}`, func() float64 {530 return float64(tm().BigIndexBlocksCacheMisses)531 })532 metrics.NewGauge(`vm_cache_misses_total{type="storage/smallIndexBlocks"}`, func() float64 {533 return float64(tm().SmallIndexBlocksCacheMisses)534 })535 metrics.NewGauge(`vm_cache_misses_total{type="indexdb/dataBlocks"}`, func() float64 {536 return float64(idbm().DataBlocksCacheMisses)537 })538 metrics.NewGauge(`vm_cache_misses_total{type="indexdb/indexBlocks"}`, func() float64 {539 return float64(idbm().IndexBlocksCacheMisses)540 })541 metrics.NewGauge(`vm_cache_misses_total{type="indexdb/tagFilters"}`, func() float64 {542 return float64(idbm().TagCacheMisses)543 })544 metrics.NewGauge(`vm_cache_misses_total{type="indexdb/uselessTagFilters"}`, func() float64 {545 return float64(idbm().UselessTagFiltersCacheMisses)546 })547 metrics.NewGauge(`vm_cache_misses_total{type="storage/regexps"}`, func() float64 {548 return float64(storage.RegexpCacheMisses())549 })550 metrics.NewGauge(`vm_deleted_metrics_total{type="indexdb"}`, func() float64 {551 return float64(idbm().DeletedMetricsCount)552 })553 metrics.NewGauge(`vm_cache_collisions_total{type="storage/tsid"}`, func() float64 {554 return float64(m().TSIDCacheCollisions)555 })556 metrics.NewGauge(`vm_cache_collisions_total{type="storage/metricName"}`, func() float64 {557 return float64(m().MetricNameCacheCollisions)558 })559}560func jsonResponseError(w http.ResponseWriter, err error) {561 logger.Errorf("%s", err)562 w.WriteHeader(http.StatusInternalServerError)563 fmt.Fprintf(w, `{"status":"error","msg":%q}`, err)564}...
addRows
Using AI Code Generation
1import (2func main() {3 err := termui.Init()4 if err != nil {5 panic(err)6 }7 defer termui.Close()8 g := termui.NewGauge()9 termui.Render(g)10 g.AddRows("Row1", "Row2", "Row3")11 termui.Render(g)12 termui.Handle("/sys/kbd/q", func(termui.Event) {13 termui.StopLoop()14 })15 termui.Loop()16}
addRows
Using AI Code Generation
1import (2func TestAddRows(t *testing.T) {3 gauge.Step("Add rows <table>", func(table *gauge.Table) {4 rows := table.GetTableRows()5 fmt.Println("Rows: ", rows)6 fmt.Println("Row count: ", len(rows))7 for _, row := range rows {8 fmt.Println("Row: ", row)9 for _, cell := range row.GetCells() {10 fmt.Println("Cell: ", cell)11 }12 }13 })14}15import (16func TestAddRows(t *testing.T) {17 gauge.Step("Add rows <table>", func(table *gauge.Table) {18 rows := table.GetTableRows()19 fmt.Println("Rows: ", rows)20 fmt.Println("Row count: ", len(rows))21 for _, row := range rows {22 fmt.Println("Row: ", row)23 for _, cell := range row.GetCells() {24 fmt.Println("Cell: ", cell)25 }26 }27 })28}29import (30func TestAddRows(t *testing.T) {31 gauge.Step("Add rows <table>", func(table *gauge.Table) {32 rows := table.GetTableRows()33 fmt.Println("Rows: ", rows)34 fmt.Println("Row count: ", len(rows))35 for _, row := range rows {36 fmt.Println("Row: ", row)37 for _, cell := range row.GetCells() {38 fmt.Println("Cell: ", cell)39 }40 }41 })42}43import (
addRows
Using AI Code Generation
1import (2func main() {3 g := metricpersist.NewGauge()4 metricDefs := make([]*metricdef.MetricDefinition, 0)5 metricDefs = append(metricDefs, &metricdef.MetricDefinition{Id: 1, OrgId: 1, Name: "metric1", Interval: 10})6 metricDefs = append(metricDefs, &metricdef.MetricDefinition{Id: 2, OrgId: 1, Name: "metric2", Interval: 10})7 metricDefs = append(metricDefs, &metricdef.MetricDefinition{Id: 3, OrgId: 1, Name: "metric3", Interval: 10})8 metricDefs = append(metricDefs, &metricdef.MetricDefinition{Id: 4, OrgId: 1, Name: "metric4", Interval: 10})9 metricDefs = append(metricDefs, &metricdef.MetricDefinition{Id: 5, OrgId: 1, Name: "metric5", Interval: 10})10 data := make([]schema.Point, 0)11 data = append(data, schema.Point{Val: 1, Ts: 10})12 data = append(data, schema.Point{Val: 2, Ts: 20})13 data = append(data, schema.Point{Val: 3, Ts: 30})14 data = append(data, schema.Point{Val: 4, Ts: 40})15 data = append(data, schema.Point{Val: 5, Ts: 50})16 g.AddRows(metricDefs, data)17 for _, metric := range metricDefs {18 fmt.Println(metric.Name)19 for _, row := range g.GetRows(metric, 0, 60) {20 fmt.Println(row)21 }22 }23}
addRows
Using AI Code Generation
1import (2func main(){3 fmt.Println("Hello World!")4}5import (6func main(){7 fmt.Println("Hello World!")8}9import (10func main(){11 fmt.Println("Hello World!")12}13import (14func main(){15 fmt.Println("Hello World!")16}17import (18func main(){19 fmt.Println("Hello World!")20}21import (22func main(){23 fmt.Println("Hello World!")24}25import (26func main(){27 fmt.Println("Hello World!")28}29import (30func main(){31 fmt.Println("Hello World!")32}33import (34func main(){35 fmt.Println("Hello World!")36}37import (38func main(){39 fmt.Println("Hello World!")40}
addRows
Using AI Code Generation
1import (2func main() {3 gauge := NewGauge("Memory Usage", "Memory Usage of the system", "Memory", []string{"Type"})4 go func() {5 for {6 v, _ := mem.VirtualMemory()7 gauge.addRows("Virtual", strconv.FormatFloat(v.UsedPercent, 'f', 2, 64))8 p, _ := process.NewProcess(1)9 m, _ := p.MemoryInfo()10 gauge.addRows("Process", strconv.FormatFloat(m.RSS, 'f', 2, 64))11 time.Sleep(1000 * time.Millisecond)12 }13 }()14 http.Handle("/metrics", gauge)15 http.ListenAndServe(":8080", nil)16}17import (18func main() {19 http.Handle("/metrics", promhttp.Handler())20 http.ListenAndServe(":8080", nil)21}22go_gc_duration_seconds{quantile="0"} 1.0754e-0523go_gc_duration_seconds{quantile="0.25"} 1.5461e-0524go_gc_duration_seconds{quantile="0.5"} 2.1536e-0525go_gc_duration_seconds{quantile="0.75"} 2.8932e-0526go_gc_duration_seconds{quantile="1"} 0.00010297
addRows
Using AI Code Generation
1import (2func main() {3 gauge.Step("add <arg1> and <arg2>", add)4 gauge.Step("add <arg1> and <arg2> and <arg3>", add)5 gauge.Step("add <arg1> and <arg2> and <arg3> and <arg4>", add)6}7func add(arg1, arg2, arg3, arg4 int) {8 fmt.Println(arg1 + arg2 + arg3 + arg4)9}
addRows
Using AI Code Generation
1import "fmt"2func main(){3 gauge1.addRows(5)4 fmt.Println(gauge1.rows)5}6import "fmt"7func main(){8 gauge1.addRows(5)9 fmt.Println(gauge1.rows)10}11import "fmt"12func main(){13 gauge1.addRows(5)14 fmt.Println(gauge1.rows)15}16import "fmt"17func main(){18 gauge1.addRows(5)19 fmt.Println(gauge1.rows)20}21import "fmt"22func main(){23 gauge1.addRows(5)24 fmt.Println(gauge1.rows)25}26import "fmt"27func main(){28 gauge1.addRows(5)29 fmt.Println(gauge1.rows)30}31import "fmt"32func main(){33 gauge1.addRows(5)34 fmt.Println(gauge1.rows)35}36import "fmt"37func main(){38 gauge1.addRows(5)39 fmt.Println(gauge1.rows)40}41import "fmt"42func main(){43 gauge1.addRows(5)44 fmt.Println(gauge1.rows)45}46import "fmt"47func main(){48 gauge1.addRows(5)49 fmt.Println(gauge1.rows)50}
addRows
Using AI Code Generation
1import "fmt"2func main() {3 fmt.Println("Hello, playground")4 g.addRows(3)5 fmt.Println(g.rows)6}7import "fmt"8func main() {9 fmt.Println("Hello, playground")10 g.addRows(3)11 fmt.Println(g.rows)12}13import "fmt"14func main() {15 fmt.Println("Hello, playground")16 g.addRows(3)17 fmt.Println(g.rows)18}19import "fmt"20func main() {21 fmt.Println("Hello, playground")22 g.addRows(3)23 fmt.Println(g.rows)24}25import "fmt"26func main() {27 fmt.Println("Hello, playground")28 g.addRows(3)29 fmt.Println(g.rows)30}31import "fmt"32func main() {33 fmt.Println("Hello, playground")34 g.addRows(3)35 fmt.Println(g.rows)36}37import "fmt"38func main() {39 fmt.Println("Hello, playground")40 g.addRows(3)41 fmt.Println(g.rows)42}43import "fmt"44func main() {45 fmt.Println("Hello, playground")46 g.addRows(3)47 fmt.Println(g.rows)48}49import "fmt"50func main() {51 fmt.Println("Hello, playground")52 g.addRows(3)53 fmt.Println(g.rows)54}
addRows
Using AI Code Generation
1import (2func addRows(table *gauge.Table) {3 fmt.Println("Table rows added")4}5func main() {6 fmt.Println("Hello World")7}8import (9func addRows(table *gauge.Table) {10 fmt.Println("Table rows added")11}12func main() {13 fmt.Println("Hello World")14}15import (16func addRows(table *gauge.Table) {17 fmt.Println("Table rows added")18}19func main() {20 fmt.Println("Hello World")21}22import (23func addRows(table *gauge.Table) {24 fmt.Println("Table rows added")25}26func main() {27 fmt.Println("Hello World")28}29import (30func addRows(table *gauge.Table) {31 fmt.Println("Table rows added")32}33func main() {34 fmt.Println("Hello World")35}36import (37func addRows(table *gauge.Table) {38 fmt.Println("Table rows added")39}40func main() {41 fmt.Println("Hello World")42}43import (44func addRows(table *gauge.Table) {45 fmt.Println("Table rows added")46}47func main() {48 fmt.Println("Hello World")49}50import (
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!