kube_cluster 1.3.1 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/Gemfile.lock +1 -1
- data/lib/kube/cluster/standard/victoria_metrics/vl_cluster.rb +36 -0
- data/lib/kube/cluster/standard/victoria_metrics/vlogs.rb +36 -0
- data/lib/kube/cluster/standard/victoria_metrics/vm_alert.rb +47 -0
- data/lib/kube/cluster/standard/victoria_metrics/vm_alertmanager.rb +37 -0
- data/lib/kube/cluster/standard/victoria_metrics/vm_alertmanager_config.rb +35 -0
- data/lib/kube/cluster/standard/victoria_metrics/vm_anomaly.rb +36 -0
- data/lib/kube/cluster/standard/victoria_metrics/vm_anomaly_config.rb +35 -0
- data/lib/kube/cluster/standard/victoria_metrics/vm_auth.rb +36 -0
- data/lib/kube/cluster/standard/victoria_metrics/vm_cluster.rb +37 -0
- data/lib/kube/cluster/standard/victoria_metrics/vm_distributed.rb +35 -0
- data/lib/kube/cluster/standard/victoria_metrics/vm_pod_scrape.rb +38 -0
- data/lib/kube/cluster/standard/victoria_metrics/vm_probe.rb +37 -0
- data/lib/kube/cluster/standard/victoria_metrics/vm_rule.rb +138 -0
- data/lib/kube/cluster/standard/victoria_metrics/vm_scrape_config.rb +36 -0
- data/lib/kube/cluster/standard/victoria_metrics/vm_static_scrape.rb +38 -0
- data/lib/kube/cluster/standard/victoria_metrics/vm_user.rb +38 -0
- data/lib/kube/cluster/standard/victoria_metrics/vt_cluster.rb +36 -0
- data/lib/kube/cluster/standard/victoria_metrics/vt_single.rb +35 -0
- data/lib/kube/cluster/version.rb +1 -1
- data/lib/kube/cluster.rb +18 -0
- metadata +19 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1e6e0a31873f5a706d272e0ff37b06a8f3565b0e8d8629b92915f24c572825d1
|
|
4
|
+
data.tar.gz: '08b20a4bb972d5b52eddd66577c79462a59611c8f84e692d092720c09bced0da'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 676e83947ff878d10e2ff3e46e9dd880120e856f480e5ed9b26d27046f7d901d07d5d044d0a3358fa99c927768f4c0c54e8af1e13fa5ef96b5806caeefa476d2
|
|
7
|
+
data.tar.gz: e8ade4344a74dd80bfaf8abec1bb43c5b0531b1130ab0c8584c4a0edb08e0a8d339dead8c35012cf517847d19cf066516717af9937890b70df744611f0809d5a
|
data/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,20 @@ All notable changes to this project are documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.4.0] - 2026-07-13
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- `Standard::VictoriaMetrics::VMRule` — a wrapper for the VictoriaMetrics
|
|
12
|
+
operator's `VMRule` CRD (pinned to `operator.victoriametrics.com/v1beta1`).
|
|
13
|
+
Rules are built from `VMRule::Group` objects, each exposing `rule`/`alert`
|
|
14
|
+
helpers that construct `Rule`/`Alert` leaves; the rule expression is the
|
|
15
|
+
return value of a block, so multi-line PromQL reads as a heredoc.
|
|
16
|
+
- `Standard::VictoriaMetrics::VMAlert` — a wrapper for the VictoriaMetrics
|
|
17
|
+
operator's `VMAlert` CRD (pinned to `operator.victoriametrics.com/v1beta1`).
|
|
18
|
+
Wires `datasource`/`remoteWrite`/`remoteRead` and defaults `selectAllByDefault`
|
|
19
|
+
to true so it evaluates every `VMRule`; `notifier_url` is optional (recording
|
|
20
|
+
rules need no notifier).
|
|
21
|
+
|
|
8
22
|
## [1.3.1] - 2026-07-13
|
|
9
23
|
|
|
10
24
|
### Changed
|
data/Gemfile.lock
CHANGED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# HA/clustered VictoriaLogs: vlstorage + vlselect + vlinsert components
|
|
11
|
+
# (the horizontally-scalable alternative to VLSingle). Retention lives on
|
|
12
|
+
# the vlstorage component, so configure the components in the block.
|
|
13
|
+
class VLCluster < Kube::Cluster["VLCluster"]
|
|
14
|
+
def initialize(name:, &block)
|
|
15
|
+
super() {
|
|
16
|
+
metadata.name = name
|
|
17
|
+
instance_exec(&block) if block
|
|
18
|
+
}
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
__END__
|
|
27
|
+
|
|
28
|
+
describe "VictoriaMetrics::VLCluster" do
|
|
29
|
+
it "initializes without error" do
|
|
30
|
+
Kube::Cluster::Standard::VictoriaMetrics::VLCluster
|
|
31
|
+
.new(name: "vlcluster")
|
|
32
|
+
.to_yaml
|
|
33
|
+
.is_a?(String)
|
|
34
|
+
.should == true
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# Legacy VictoriaLogs kind (operator.victoriametrics.com/v1beta1). New
|
|
11
|
+
# deployments should prefer VLSingle (v1); this wrapper exists for
|
|
12
|
+
# completeness / migrating existing objects. Spec is configured in block.
|
|
13
|
+
class VLogs < Kube::Cluster["VLogs"]
|
|
14
|
+
def initialize(name:, &block)
|
|
15
|
+
super() {
|
|
16
|
+
metadata.name = name
|
|
17
|
+
instance_exec(&block) if block
|
|
18
|
+
}
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
__END__
|
|
27
|
+
|
|
28
|
+
describe "VictoriaMetrics::VLogs" do
|
|
29
|
+
it "initializes without error" do
|
|
30
|
+
Kube::Cluster::Standard::VictoriaMetrics::VLogs
|
|
31
|
+
.new(name: "vlogs")
|
|
32
|
+
.to_yaml
|
|
33
|
+
.is_a?(String)
|
|
34
|
+
.should == true
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# Evaluates VMRule recording/alerting rules (selecting all by default).
|
|
11
|
+
# Recording-rule output is written back via remote_write_url; a notifier
|
|
12
|
+
# is only needed for alerting rules, so it is optional.
|
|
13
|
+
class VMAlert < Kube::Cluster["VMAlert"]
|
|
14
|
+
def initialize(name:, datasource_url:, remote_write_url:, remote_read_url: nil,
|
|
15
|
+
notifier_url: nil, evaluation_interval: nil, select_all: true, &block)
|
|
16
|
+
super() {
|
|
17
|
+
metadata.name = name
|
|
18
|
+
spec.selectAllByDefault = select_all
|
|
19
|
+
spec.datasource = { url: datasource_url }
|
|
20
|
+
spec.remoteWrite = { url: remote_write_url }
|
|
21
|
+
spec.remoteRead = { url: remote_read_url } if remote_read_url
|
|
22
|
+
spec.notifiers = [{ url: notifier_url }] if notifier_url
|
|
23
|
+
spec.evaluationInterval = evaluation_interval if evaluation_interval
|
|
24
|
+
instance_exec(&block) if block
|
|
25
|
+
}
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
__END__
|
|
34
|
+
|
|
35
|
+
describe "VictoriaMetrics::VMAlert" do
|
|
36
|
+
it "wires datasource and remote-write for recording rules" do
|
|
37
|
+
yaml = Kube::Cluster::Standard::VictoriaMetrics::VMAlert.new(
|
|
38
|
+
name: "vmalert",
|
|
39
|
+
datasource_url: "http://vmsingle-vmsingle.metrics.svc:8429/prometheus",
|
|
40
|
+
remote_write_url: "http://vmsingle-vmsingle.metrics.svc:8429/api/v1/write"
|
|
41
|
+
).to_yaml
|
|
42
|
+
|
|
43
|
+
yaml.include?("operator.victoriametrics.com/v1beta1").should == true
|
|
44
|
+
yaml.include?("selectAllByDefault").should == true
|
|
45
|
+
yaml.include?("/api/v1/write").should == true
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# Managed Alertmanager instance. Notification routing/receivers can be
|
|
11
|
+
# supplied inline via spec.configRawYaml or selected from
|
|
12
|
+
# VMAlertmanagerConfig objects; configure that in the block.
|
|
13
|
+
class VMAlertmanager < Kube::Cluster["VMAlertmanager"]
|
|
14
|
+
def initialize(name:, replica_count: 1, &block)
|
|
15
|
+
super() {
|
|
16
|
+
metadata.name = name
|
|
17
|
+
spec.replicaCount = replica_count
|
|
18
|
+
instance_exec(&block) if block
|
|
19
|
+
}
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
__END__
|
|
28
|
+
|
|
29
|
+
describe "VictoriaMetrics::VMAlertmanager" do
|
|
30
|
+
it "initializes without error" do
|
|
31
|
+
Kube::Cluster::Standard::VictoriaMetrics::VMAlertmanager
|
|
32
|
+
.new(name: "vmalertmanager")
|
|
33
|
+
.to_yaml
|
|
34
|
+
.is_a?(String)
|
|
35
|
+
.should == true
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# Alertmanager routing tree and receivers, selected by a VMAlertmanager.
|
|
11
|
+
# Define spec.route and spec.receivers in the block.
|
|
12
|
+
class VMAlertmanagerConfig < Kube::Cluster["VMAlertmanagerConfig"]
|
|
13
|
+
def initialize(name:, &block)
|
|
14
|
+
super() {
|
|
15
|
+
metadata.name = name
|
|
16
|
+
instance_exec(&block) if block
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
__END__
|
|
26
|
+
|
|
27
|
+
describe "VictoriaMetrics::VMAlertmanagerConfig" do
|
|
28
|
+
it "initializes without error" do
|
|
29
|
+
Kube::Cluster::Standard::VictoriaMetrics::VMAlertmanagerConfig
|
|
30
|
+
.new(name: "vmalertmanagerconfig")
|
|
31
|
+
.to_yaml
|
|
32
|
+
.is_a?(String)
|
|
33
|
+
.should == true
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# VictoriaMetrics Anomaly Detection service (vmanomaly). Reads metrics,
|
|
11
|
+
# fits models, and writes anomaly scores back. Provide the model/reader/
|
|
12
|
+
# writer configuration via spec.configRawYaml in the block.
|
|
13
|
+
class VMAnomaly < Kube::Cluster["VMAnomaly"]
|
|
14
|
+
def initialize(name:, &block)
|
|
15
|
+
super() {
|
|
16
|
+
metadata.name = name
|
|
17
|
+
instance_exec(&block) if block
|
|
18
|
+
}
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
__END__
|
|
27
|
+
|
|
28
|
+
describe "VictoriaMetrics::VMAnomaly" do
|
|
29
|
+
it "initializes without error" do
|
|
30
|
+
Kube::Cluster::Standard::VictoriaMetrics::VMAnomaly
|
|
31
|
+
.new(name: "vmanomaly")
|
|
32
|
+
.to_yaml
|
|
33
|
+
.is_a?(String)
|
|
34
|
+
.should == true
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# Reusable configuration object referenced by a VMAnomaly instance.
|
|
11
|
+
# Define the models/schedulers in the block.
|
|
12
|
+
class VMAnomalyConfig < Kube::Cluster["VMAnomalyConfig"]
|
|
13
|
+
def initialize(name:, &block)
|
|
14
|
+
super() {
|
|
15
|
+
metadata.name = name
|
|
16
|
+
instance_exec(&block) if block
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
__END__
|
|
26
|
+
|
|
27
|
+
describe "VictoriaMetrics::VMAnomalyConfig" do
|
|
28
|
+
it "initializes without error" do
|
|
29
|
+
Kube::Cluster::Standard::VictoriaMetrics::VMAnomalyConfig
|
|
30
|
+
.new(name: "vmanomalyconfig") { spec.schedulers = {} }
|
|
31
|
+
.to_yaml
|
|
32
|
+
.is_a?(String)
|
|
33
|
+
.should == true
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# Auth proxy / router that sits in front of VictoriaMetrics components and
|
|
11
|
+
# dispatches requests according to the VMUser objects it selects. Configure
|
|
12
|
+
# user selection and unauthorized-access rules in the block.
|
|
13
|
+
class VMAuth < Kube::Cluster["VMAuth"]
|
|
14
|
+
def initialize(name:, &block)
|
|
15
|
+
super() {
|
|
16
|
+
metadata.name = name
|
|
17
|
+
instance_exec(&block) if block
|
|
18
|
+
}
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
__END__
|
|
27
|
+
|
|
28
|
+
describe "VictoriaMetrics::VMAuth" do
|
|
29
|
+
it "initializes without error" do
|
|
30
|
+
Kube::Cluster::Standard::VictoriaMetrics::VMAuth
|
|
31
|
+
.new(name: "vmauth")
|
|
32
|
+
.to_yaml
|
|
33
|
+
.is_a?(String)
|
|
34
|
+
.should == true
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# HA/clustered VictoriaMetrics: vmstorage + vmselect + vminsert
|
|
11
|
+
# components (the horizontally-scalable alternative to VMSingle).
|
|
12
|
+
# Configure the three components in the block.
|
|
13
|
+
class VMCluster < Kube::Cluster["VMCluster"]
|
|
14
|
+
def initialize(name:, retention_period: "30d", &block)
|
|
15
|
+
super() {
|
|
16
|
+
metadata.name = name
|
|
17
|
+
spec.retentionPeriod = retention_period
|
|
18
|
+
instance_exec(&block) if block
|
|
19
|
+
}
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
__END__
|
|
28
|
+
|
|
29
|
+
describe "VictoriaMetrics::VMCluster" do
|
|
30
|
+
it "initializes without error" do
|
|
31
|
+
Kube::Cluster::Standard::VictoriaMetrics::VMCluster
|
|
32
|
+
.new(name: "vmcluster")
|
|
33
|
+
.to_yaml
|
|
34
|
+
.is_a?(String)
|
|
35
|
+
.should == true
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# Multi-zone/distributed VictoriaMetrics topology. The full shape (zones,
|
|
11
|
+
# common settings) is configured in the block.
|
|
12
|
+
class VMDistributed < Kube::Cluster["VMDistributed"]
|
|
13
|
+
def initialize(name:, &block)
|
|
14
|
+
super() {
|
|
15
|
+
metadata.name = name
|
|
16
|
+
instance_exec(&block) if block
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
__END__
|
|
26
|
+
|
|
27
|
+
describe "VictoriaMetrics::VMDistributed" do
|
|
28
|
+
it "initializes without error" do
|
|
29
|
+
Kube::Cluster::Standard::VictoriaMetrics::VMDistributed
|
|
30
|
+
.new(name: "vmdistributed") { spec.retain = true }
|
|
31
|
+
.to_yaml
|
|
32
|
+
.is_a?(String)
|
|
33
|
+
.should == true
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# Declares how to scrape the pods selected by the app.kubernetes.io/name
|
|
11
|
+
# label (the pod-selector analogue of VMServiceScrape), relabelling the
|
|
12
|
+
# metrics onto a job.
|
|
13
|
+
class VMPodScrape < Kube::Cluster["VMPodScrape"]
|
|
14
|
+
def initialize(name:, job:, match_name:, port:, &block)
|
|
15
|
+
super() {
|
|
16
|
+
metadata.name = name
|
|
17
|
+
spec.selector = { matchLabels: { "app.kubernetes.io/name" => match_name } }
|
|
18
|
+
spec.podMetricsEndpoints = [{ port: port, relabelConfigs: [{ targetLabel: "job", replacement: job }] }]
|
|
19
|
+
instance_exec(&block) if block
|
|
20
|
+
}
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
__END__
|
|
29
|
+
|
|
30
|
+
describe "VictoriaMetrics::VMPodScrape" do
|
|
31
|
+
it "initializes without error" do
|
|
32
|
+
Kube::Cluster::Standard::VictoriaMetrics::VMPodScrape
|
|
33
|
+
.new(name: "opencost", job: "opencost", match_name: "opencost", port: "http")
|
|
34
|
+
.to_yaml
|
|
35
|
+
.is_a?(String)
|
|
36
|
+
.should == true
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# Blackbox/probe scraping: points a prober (e.g. blackbox_exporter) at a
|
|
11
|
+
# set of targets. Pass the prober URL here and the targets/module in the
|
|
12
|
+
# block via spec.targets and spec.module.
|
|
13
|
+
class VMProbe < Kube::Cluster["VMProbe"]
|
|
14
|
+
def initialize(name:, prober_url:, &block)
|
|
15
|
+
super() {
|
|
16
|
+
metadata.name = name
|
|
17
|
+
spec.vmProberSpec = { url: prober_url }
|
|
18
|
+
instance_exec(&block) if block
|
|
19
|
+
}
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
__END__
|
|
28
|
+
|
|
29
|
+
describe "VictoriaMetrics::VMProbe" do
|
|
30
|
+
it "initializes without error" do
|
|
31
|
+
Kube::Cluster::Standard::VictoriaMetrics::VMProbe
|
|
32
|
+
.new(name: "blackbox", prober_url: "http://blackbox-exporter.metrics.svc:9115")
|
|
33
|
+
.to_yaml
|
|
34
|
+
.is_a?(String)
|
|
35
|
+
.should == true
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# A recording rule. The block returns the PromQL expression, so
|
|
11
|
+
# multi-line queries read as a heredoc at the call site.
|
|
12
|
+
class Rule
|
|
13
|
+
def initialize(name, labels: nil, &block)
|
|
14
|
+
@name = name
|
|
15
|
+
@labels = labels
|
|
16
|
+
@expr = block.call.to_s if block
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def to_h
|
|
20
|
+
h = { record: @name, expr: @expr }
|
|
21
|
+
h[:labels] = @labels if @labels
|
|
22
|
+
h
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# An alerting rule. The block returns the PromQL expression.
|
|
27
|
+
class Alert
|
|
28
|
+
def initialize(name, for_: nil, keep_firing_for: nil, labels: nil, annotations: nil, &block)
|
|
29
|
+
@name = name
|
|
30
|
+
@for = for_
|
|
31
|
+
@keep_firing_for = keep_firing_for
|
|
32
|
+
@labels = labels
|
|
33
|
+
@annotations = annotations
|
|
34
|
+
@expr = block.call.to_s if block
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def to_h
|
|
38
|
+
h = { alert: @name, expr: @expr }
|
|
39
|
+
h[:for] = @for if @for
|
|
40
|
+
h[:keep_firing_for] = @keep_firing_for if @keep_firing_for
|
|
41
|
+
h[:labels] = @labels if @labels
|
|
42
|
+
h[:annotations] = @annotations if @annotations
|
|
43
|
+
h
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# A named group of rules. `rule`/`alert` build and collect the leaves;
|
|
48
|
+
# the block is instance_eval'd so those helpers read like keywords.
|
|
49
|
+
#
|
|
50
|
+
# Group.new("node.rules") {
|
|
51
|
+
# rule "node:node_num_cpu:sum" do
|
|
52
|
+
# <<~PROMQL
|
|
53
|
+
# count by (cluster, node) (...)
|
|
54
|
+
# PROMQL
|
|
55
|
+
# end
|
|
56
|
+
# }
|
|
57
|
+
class Group
|
|
58
|
+
def initialize(name, &block)
|
|
59
|
+
@name = name
|
|
60
|
+
@rules = []
|
|
61
|
+
instance_eval(&block) if block
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def rule(name, **opts, &block) = @rules << Rule.new(name, **opts, &block)
|
|
65
|
+
def alert(name, **opts, &block) = @rules << Alert.new(name, **opts, &block)
|
|
66
|
+
|
|
67
|
+
def to_h = { name: @name, rules: @rules.map(&:to_h) }
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# A VMRule CR: a set of rule Groups evaluated by VictoriaMetrics.
|
|
71
|
+
#
|
|
72
|
+
# VMRule.new(name: "node", groups: [
|
|
73
|
+
# Group.new("node.rules") { ... },
|
|
74
|
+
# ])
|
|
75
|
+
class VMRule < Kube::Cluster["VMRule"]
|
|
76
|
+
def initialize(name:, groups:, &block)
|
|
77
|
+
super() {
|
|
78
|
+
metadata.name = name
|
|
79
|
+
spec.groups = groups.map(&:to_h)
|
|
80
|
+
instance_exec(&block) if block
|
|
81
|
+
}
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
__END__
|
|
90
|
+
|
|
91
|
+
describe "VictoriaMetrics::VMRule" do
|
|
92
|
+
vmrule = Kube::Cluster::Standard::VictoriaMetrics::VMRule
|
|
93
|
+
group = Kube::Cluster::Standard::VictoriaMetrics::Group
|
|
94
|
+
|
|
95
|
+
it "emits a recording rule with the resolved v1beta1 apiVersion" do
|
|
96
|
+
yaml = vmrule.new(
|
|
97
|
+
name: "node",
|
|
98
|
+
groups: [
|
|
99
|
+
group.new("node.rules") {
|
|
100
|
+
rule "node:node_num_cpu:sum" do
|
|
101
|
+
"count by (cluster, node) (node_cpu_seconds_total)"
|
|
102
|
+
end
|
|
103
|
+
},
|
|
104
|
+
]
|
|
105
|
+
).to_yaml
|
|
106
|
+
|
|
107
|
+
yaml.include?("operator.victoriametrics.com/v1beta1").should == true
|
|
108
|
+
yaml.include?("record: node:node_num_cpu:sum").should == true
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it "carries labels on records" do
|
|
112
|
+
group.new("g") {
|
|
113
|
+
rule "r", labels: { quantile: "0.99" } do
|
|
114
|
+
"histogram_quantile(0.99, x)"
|
|
115
|
+
end
|
|
116
|
+
}.to_h.should == {
|
|
117
|
+
name: "g",
|
|
118
|
+
rules: [{ record: "r", expr: "histogram_quantile(0.99, x)", labels: { quantile: "0.99" } }],
|
|
119
|
+
}
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it "builds alerts with for/labels/annotations" do
|
|
123
|
+
group.new("g") {
|
|
124
|
+
alert "Down", for_: "5m", labels: { severity: "warning" }, annotations: { summary: "down" } do
|
|
125
|
+
"up == 0"
|
|
126
|
+
end
|
|
127
|
+
}.to_h.should == {
|
|
128
|
+
name: "g",
|
|
129
|
+
rules: [{
|
|
130
|
+
alert: "Down",
|
|
131
|
+
expr: "up == 0",
|
|
132
|
+
for: "5m",
|
|
133
|
+
labels: { severity: "warning" },
|
|
134
|
+
annotations: { summary: "down" },
|
|
135
|
+
}],
|
|
136
|
+
}
|
|
137
|
+
end
|
|
138
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# Generic scrape configuration supporting the full range of service-
|
|
11
|
+
# discovery mechanisms (static, kubernetes, http, ec2, consul, …). Declare
|
|
12
|
+
# the discovery configs and relabelling in the block.
|
|
13
|
+
class VMScrapeConfig < Kube::Cluster["VMScrapeConfig"]
|
|
14
|
+
def initialize(name:, &block)
|
|
15
|
+
super() {
|
|
16
|
+
metadata.name = name
|
|
17
|
+
instance_exec(&block) if block
|
|
18
|
+
}
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
__END__
|
|
27
|
+
|
|
28
|
+
describe "VictoriaMetrics::VMScrapeConfig" do
|
|
29
|
+
it "initializes without error" do
|
|
30
|
+
Kube::Cluster::Standard::VictoriaMetrics::VMScrapeConfig
|
|
31
|
+
.new(name: "vmscrapeconfig")
|
|
32
|
+
.to_yaml
|
|
33
|
+
.is_a?(String)
|
|
34
|
+
.should == true
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# Scrapes a fixed set of static targets (host:port) under a named job —
|
|
11
|
+
# for endpoints that have no Service/Pod to select. Extra per-endpoint
|
|
12
|
+
# settings (path, scheme, labels) can be added in the block.
|
|
13
|
+
class VMStaticScrape < Kube::Cluster["VMStaticScrape"]
|
|
14
|
+
def initialize(name:, job:, targets:, &block)
|
|
15
|
+
super() {
|
|
16
|
+
metadata.name = name
|
|
17
|
+
spec.jobName = job
|
|
18
|
+
spec.targetEndpoints = [{ targets: Array(targets) }]
|
|
19
|
+
instance_exec(&block) if block
|
|
20
|
+
}
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
__END__
|
|
29
|
+
|
|
30
|
+
describe "VictoriaMetrics::VMStaticScrape" do
|
|
31
|
+
it "initializes without error" do
|
|
32
|
+
Kube::Cluster::Standard::VictoriaMetrics::VMStaticScrape
|
|
33
|
+
.new(name: "external", job: "external", targets: ["10.0.0.1:9100"])
|
|
34
|
+
.to_yaml
|
|
35
|
+
.is_a?(String)
|
|
36
|
+
.should == true
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# A user/route definition consumed by VMAuth: maps credentials to a set of
|
|
11
|
+
# upstream target refs. Pass the routing in the block via spec.targetRefs.
|
|
12
|
+
class VMUser < Kube::Cluster["VMUser"]
|
|
13
|
+
def initialize(name:, username: nil, &block)
|
|
14
|
+
super() {
|
|
15
|
+
metadata.name = name
|
|
16
|
+
spec.username = username if username
|
|
17
|
+
instance_exec(&block) if block
|
|
18
|
+
}
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
__END__
|
|
27
|
+
|
|
28
|
+
describe "VictoriaMetrics::VMUser" do
|
|
29
|
+
it "initializes without error" do
|
|
30
|
+
Kube::Cluster::Standard::VictoriaMetrics::VMUser
|
|
31
|
+
.new(name: "vmuser", username: "reader") {
|
|
32
|
+
spec.targetRefs = [{ crd: { kind: "VMSingle", name: "vmsingle", namespace: "metrics" }, paths: ["/"] }]
|
|
33
|
+
}
|
|
34
|
+
.to_yaml
|
|
35
|
+
.is_a?(String)
|
|
36
|
+
.should == true
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# HA/clustered VictoriaTraces: storage + select + insert components
|
|
11
|
+
# (the horizontally-scalable alternative to VTSingle). Retention lives on
|
|
12
|
+
# the storage component, so configure the components in the block.
|
|
13
|
+
class VTCluster < Kube::Cluster["VTCluster"]
|
|
14
|
+
def initialize(name:, &block)
|
|
15
|
+
super() {
|
|
16
|
+
metadata.name = name
|
|
17
|
+
instance_exec(&block) if block
|
|
18
|
+
}
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
__END__
|
|
27
|
+
|
|
28
|
+
describe "VictoriaMetrics::VTCluster" do
|
|
29
|
+
it "initializes without error" do
|
|
30
|
+
Kube::Cluster::Standard::VictoriaMetrics::VTCluster
|
|
31
|
+
.new(name: "vtcluster")
|
|
32
|
+
.to_yaml
|
|
33
|
+
.is_a?(String)
|
|
34
|
+
.should == true
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
5
|
+
|
|
6
|
+
module Kube
|
|
7
|
+
module Cluster
|
|
8
|
+
module Standard
|
|
9
|
+
module VictoriaMetrics
|
|
10
|
+
# Single-node VictoriaTraces store.
|
|
11
|
+
class VTSingle < Kube::Cluster["VTSingle"]
|
|
12
|
+
def initialize(name:, retention_period: "30d", &block)
|
|
13
|
+
super() {
|
|
14
|
+
metadata.name = name
|
|
15
|
+
spec.retentionPeriod = retention_period
|
|
16
|
+
instance_exec(&block) if block
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
__END__
|
|
26
|
+
|
|
27
|
+
describe "VictoriaMetrics::VTSingle" do
|
|
28
|
+
it "initializes without error" do
|
|
29
|
+
Kube::Cluster::Standard::VictoriaMetrics::VTSingle
|
|
30
|
+
.new(name: "vtsingle")
|
|
31
|
+
.to_yaml
|
|
32
|
+
.is_a?(String)
|
|
33
|
+
.should == true
|
|
34
|
+
end
|
|
35
|
+
end
|
data/lib/kube/cluster/version.rb
CHANGED
data/lib/kube/cluster.rb
CHANGED
|
@@ -126,11 +126,29 @@ Kube::Cluster.config do
|
|
|
126
126
|
|
|
127
127
|
# VictoriaMetrics operator.
|
|
128
128
|
resolve "VLAgent", to: "operator.victoriametrics.com/v1/VLAgent"
|
|
129
|
+
resolve "VLCluster", to: "operator.victoriametrics.com/v1/VLCluster"
|
|
130
|
+
resolve "VLogs", to: "operator.victoriametrics.com/v1beta1/VLogs"
|
|
129
131
|
resolve "VLSingle", to: "operator.victoriametrics.com/v1/VLSingle"
|
|
130
132
|
resolve "VMAgent", to: "operator.victoriametrics.com/v1beta1/VMAgent"
|
|
133
|
+
resolve "VMAlert", to: "operator.victoriametrics.com/v1beta1/VMAlert"
|
|
134
|
+
resolve "VMAlertmanager", to: "operator.victoriametrics.com/v1beta1/VMAlertmanager"
|
|
135
|
+
resolve "VMAlertmanagerConfig", to: "operator.victoriametrics.com/v1beta1/VMAlertmanagerConfig"
|
|
136
|
+
resolve "VMAnomaly", to: "operator.victoriametrics.com/v1/VMAnomaly"
|
|
137
|
+
resolve "VMAnomalyConfig", to: "operator.victoriametrics.com/v1/VMAnomalyConfig"
|
|
138
|
+
resolve "VMAuth", to: "operator.victoriametrics.com/v1beta1/VMAuth"
|
|
139
|
+
resolve "VMCluster", to: "operator.victoriametrics.com/v1beta1/VMCluster"
|
|
140
|
+
resolve "VMDistributed", to: "operator.victoriametrics.com/v1alpha1/VMDistributed"
|
|
131
141
|
resolve "VMNodeScrape", to: "operator.victoriametrics.com/v1beta1/VMNodeScrape"
|
|
142
|
+
resolve "VMPodScrape", to: "operator.victoriametrics.com/v1beta1/VMPodScrape"
|
|
143
|
+
resolve "VMProbe", to: "operator.victoriametrics.com/v1beta1/VMProbe"
|
|
144
|
+
resolve "VMRule", to: "operator.victoriametrics.com/v1beta1/VMRule"
|
|
145
|
+
resolve "VMScrapeConfig", to: "operator.victoriametrics.com/v1beta1/VMScrapeConfig"
|
|
132
146
|
resolve "VMServiceScrape", to: "operator.victoriametrics.com/v1beta1/VMServiceScrape"
|
|
133
147
|
resolve "VMSingle", to: "operator.victoriametrics.com/v1beta1/VMSingle"
|
|
148
|
+
resolve "VMStaticScrape", to: "operator.victoriametrics.com/v1beta1/VMStaticScrape"
|
|
149
|
+
resolve "VMUser", to: "operator.victoriametrics.com/v1beta1/VMUser"
|
|
150
|
+
resolve "VTCluster", to: "operator.victoriametrics.com/v1/VTCluster"
|
|
151
|
+
resolve "VTSingle", to: "operator.victoriametrics.com/v1/VTSingle"
|
|
134
152
|
|
|
135
153
|
# Gateway API — pin to the stable v1 group/version.
|
|
136
154
|
resolve "GatewayClass", to: "gateway.networking.k8s.io/v1/GatewayClass"
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kube_cluster
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Nathan K
|
|
@@ -244,11 +244,29 @@ files:
|
|
|
244
244
|
- lib/kube/cluster/standard/service_account.rb
|
|
245
245
|
- lib/kube/cluster/standard/service_account_with_role.rb
|
|
246
246
|
- lib/kube/cluster/standard/victoria_metrics/vl_agent.rb
|
|
247
|
+
- lib/kube/cluster/standard/victoria_metrics/vl_cluster.rb
|
|
247
248
|
- lib/kube/cluster/standard/victoria_metrics/vl_single.rb
|
|
249
|
+
- lib/kube/cluster/standard/victoria_metrics/vlogs.rb
|
|
248
250
|
- lib/kube/cluster/standard/victoria_metrics/vm_agent.rb
|
|
251
|
+
- lib/kube/cluster/standard/victoria_metrics/vm_alert.rb
|
|
252
|
+
- lib/kube/cluster/standard/victoria_metrics/vm_alertmanager.rb
|
|
253
|
+
- lib/kube/cluster/standard/victoria_metrics/vm_alertmanager_config.rb
|
|
254
|
+
- lib/kube/cluster/standard/victoria_metrics/vm_anomaly.rb
|
|
255
|
+
- lib/kube/cluster/standard/victoria_metrics/vm_anomaly_config.rb
|
|
256
|
+
- lib/kube/cluster/standard/victoria_metrics/vm_auth.rb
|
|
257
|
+
- lib/kube/cluster/standard/victoria_metrics/vm_cluster.rb
|
|
258
|
+
- lib/kube/cluster/standard/victoria_metrics/vm_distributed.rb
|
|
249
259
|
- lib/kube/cluster/standard/victoria_metrics/vm_node_scrape.rb
|
|
260
|
+
- lib/kube/cluster/standard/victoria_metrics/vm_pod_scrape.rb
|
|
261
|
+
- lib/kube/cluster/standard/victoria_metrics/vm_probe.rb
|
|
262
|
+
- lib/kube/cluster/standard/victoria_metrics/vm_rule.rb
|
|
263
|
+
- lib/kube/cluster/standard/victoria_metrics/vm_scrape_config.rb
|
|
250
264
|
- lib/kube/cluster/standard/victoria_metrics/vm_service_scrape.rb
|
|
251
265
|
- lib/kube/cluster/standard/victoria_metrics/vm_single.rb
|
|
266
|
+
- lib/kube/cluster/standard/victoria_metrics/vm_static_scrape.rb
|
|
267
|
+
- lib/kube/cluster/standard/victoria_metrics/vm_user.rb
|
|
268
|
+
- lib/kube/cluster/standard/victoria_metrics/vt_cluster.rb
|
|
269
|
+
- lib/kube/cluster/standard/victoria_metrics/vt_single.rb
|
|
252
270
|
- lib/kube/cluster/standard/volume_processing.rb
|
|
253
271
|
- lib/kube/cluster/version.rb
|
|
254
272
|
- lib/kube/cluster/version.rb.erb
|