Skip to content

Commit f105f5c

Browse files
authored
Add basic write load generator. (#36)
* Add basic write load generator. * Record some metrics * go mod tidy * go mod vendor * Add simple query load generator. * Allow specifying query duration. * Don't record success on failure.
1 parent 92db458 commit f105f5c

File tree

1,100 files changed

+733758
-4
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,100 files changed

+733758
-4
lines changed

cmd/cortextool/main.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ import (
99
)
1010

1111
var (
12-
ruleCommand commands.RuleCommand
13-
alertCommand commands.AlertCommand
14-
logConfig commands.LoggerConfig
15-
pushGateway commands.PushGatewayConfig
12+
ruleCommand commands.RuleCommand
13+
alertCommand commands.AlertCommand
14+
logConfig commands.LoggerConfig
15+
pushGateway commands.PushGatewayConfig
16+
loadgenCommand commands.LoadgenCommand
1617
)
1718

1819
func main() {
@@ -22,6 +23,7 @@ func main() {
2223
alertCommand.Register(app)
2324
ruleCommand.Register(app)
2425
pushGateway.Register(app)
26+
loadgenCommand.Register(app)
2527
kingpin.MustParse(app.Parse(os.Args[1:]))
2628

2729
pushGateway.Stop()

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ require (
1010
github.com/alecthomas/repr v0.0.0-20181024024818-d37bc2a10ba1 // indirect
1111
github.com/cortexproject/cortex v0.4.0
1212
github.com/dlclark/regexp2 v1.2.0 // indirect
13+
github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48
14+
github.com/golang/snappy v0.0.1
1315
github.com/jpillora/backoff v1.0.0 // indirect
1416
github.com/mattn/go-isatty v0.0.9 // indirect
1517
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db

go.sum

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
44
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
55
cloud.google.com/go v0.44.1 h1:7gXaI3V/b4DRaK++rTqhRajcT7z8gtP0qKMZTXqlySM=
66
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
7+
contrib.go.opencensus.io/exporter/ocagent v0.6.0 h1:Z1n6UAyr0QwM284yUuh5Zd8JlvxUGAhFZcgMJkMPrGM=
78
contrib.go.opencensus.io/exporter/ocagent v0.6.0/go.mod h1:zmKjrJcdo0aYcVS7bmEeSEBLPA9YJp5bjrofdU3pIXs=
89
contrib.go.opencensus.io/exporter/stackdriver v0.6.0/go.mod h1:QeFzMJDAw8TXt5+aRaSuE8l5BwaMIOIlaVkBOPRuMuw=
910
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
@@ -86,6 +87,7 @@ github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQ
8687
github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
8788
github.com/cenkalti/backoff v1.0.0 h1:2XeuDgvPv/6QDyzIuxb6n36ADVocyqTLlOSpYBGYtvM=
8889
github.com/cenkalti/backoff v1.0.0/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
90+
github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk=
8991
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
9092
github.com/cespare/xxhash v0.0.0-20181017004759-096ff4a8a059/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
9193
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
@@ -150,6 +152,7 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF
150152
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
151153
github.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
152154
github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
155+
github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M=
153156
github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
154157
github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb h1:IT4JYU7k4ikYg1SCxNI1/Tieq/NFvh6dzLdgi7eu0tM=
155158
github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc=
@@ -158,6 +161,7 @@ github.com/fatih/structtag v1.0.0/go.mod h1:IKitwq45uXL/yqi5mYghiD3w9H6eTOvI9vnk
158161
github.com/fluent/fluent-logger-golang v1.2.1 h1:CMA+mw2zMiOGEOarZtaqM3GBWT1IVLNncNi0nKELtmU=
159162
github.com/fluent/fluent-logger-golang v1.2.1/go.mod h1:2/HCT/jTy78yGyeNGQLGQsjF3zzzAuy6Xlk6FCMV5eU=
160163
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
164+
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
161165
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
162166
github.com/fsouza/fake-gcs-server v1.3.0 h1:f2mbomatUsbw8NRY7rzqiiWNn4BRM+Jredz0Pt70Usg=
163167
github.com/fsouza/fake-gcs-server v1.3.0/go.mod h1:Lq+43m2znsXfDKHnQMfdA0HpYYAEJsfizsbpk5k3TLo=
@@ -295,8 +299,10 @@ github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+
295299
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
296300
github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
297301
github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
302+
github.com/googleapis/gnostic v0.3.0 h1:CcQijm0XKekKjP/YCz28LXVSpgguuB+nCxaSjCe09y0=
298303
github.com/googleapis/gnostic v0.3.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
299304
github.com/gophercloud/gophercloud v0.0.0-20190126172459-c818fa66e4c8/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4=
305+
github.com/gophercloud/gophercloud v0.3.0 h1:6sjpKIpVwRIIwmcEGp+WwNovNsem+c+2vm6oxshRpL8=
300306
github.com/gophercloud/gophercloud v0.3.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
301307
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
302308
github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
@@ -370,6 +376,7 @@ github.com/hashicorp/serf v0.8.2 h1:YZ7UKsJv+hKjqGVUUbtE3HNj79Eln2oQ75tniF6iPt0=
370376
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
371377
github.com/hashicorp/serf v0.8.3 h1:MWYcmct5EtKz0efYooPcL0yNkem+7kWxqXDi/UIh+8k=
372378
github.com/hashicorp/serf v0.8.3/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc1oal+k=
379+
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
373380
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
374381
github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
375382
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
@@ -486,10 +493,12 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v
486493
github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
487494
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
488495
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
496+
github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w=
489497
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
490498
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
491499
github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
492500
github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
501+
github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo=
493502
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
494503
github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02 h1:0R5mDLI66Qw13qN80TRz85zthQ2nf2+uDyiV23w6c3Q=
495504
github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc=
@@ -564,6 +573,7 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So
564573
github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
565574
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
566575
github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
576+
github.com/samuel/go-zookeeper v0.0.0-20190810000440-0ceca61e4d75 h1:cA+Ubq9qEVIQhIWvP2kNuSZ2CmnfBJFSRq+kO1pu2cc=
567577
github.com/samuel/go-zookeeper v0.0.0-20190810000440-0ceca61e4d75/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
568578
github.com/satori/go.uuid v0.0.0-20160603004225-b111a074d5ef/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
569579
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
@@ -834,6 +844,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8
834844
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
835845
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
836846
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
847+
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
837848
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
838849
gopkg.in/fsnotify/fsnotify.v1 v1.4.7 h1:XNNYLJHt73EyYiCZi6+xjupS9CpvmiDgjPTAjrBlQbo=
839850
gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE=
@@ -843,6 +854,7 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
843854
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
844855
gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
845856
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
857+
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
846858
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
847859
gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0=
848860
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
@@ -858,21 +870,27 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh
858870
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
859871
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
860872
k8s.io/api v0.0.0-20190620084959-7cf5895f2711/go.mod h1:TBhBqb1AWbBQbW3XRusr7n7E4v2+5ZY8r8sAMnyFC5A=
873+
k8s.io/api v0.0.0-20190813020757-36bff7324fb7 h1:4uJOjRn9kWq4AqJRE8+qzmAy+lJd9rh8TY455dNef4U=
861874
k8s.io/api v0.0.0-20190813020757-36bff7324fb7/go.mod h1:3Iy+myeAORNCLgjd/Xu9ebwN7Vh59Bw0vh9jhoX+V58=
862875
k8s.io/apimachinery v0.0.0-20190612205821-1799e75a0719/go.mod h1:I4A+glKBHiTgiEjQiCCQfCAIcIMFGt291SmsvcrFzJA=
876+
k8s.io/apimachinery v0.0.0-20190809020650-423f5d784010 h1:pyoq062NftC1y/OcnbSvgolyZDJ8y4fmUPWMkdA6gfU=
863877
k8s.io/apimachinery v0.0.0-20190809020650-423f5d784010/go.mod h1:Waf/xTS2FGRrgXCkO5FP3XxTOWh0qLf2QhL1qFZZ/R8=
864878
k8s.io/client-go v0.0.0-20190620085101-78d2af792bab/go.mod h1:E95RaSlHr79aHaX0aGSwcPNfygDiPKOVXdmivCIZT0k=
879+
k8s.io/client-go v12.0.0+incompatible h1:YlJxncpeVUC98/WMZKC3JZGk/OXQWCZjAB4Xr3B17RY=
865880
k8s.io/client-go v12.0.0+incompatible/go.mod h1:E95RaSlHr79aHaX0aGSwcPNfygDiPKOVXdmivCIZT0k=
866881
k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
867882
k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
868883
k8s.io/klog v0.3.0 h1:0VPpR+sizsiivjIfIAQH/rl8tan6jvWkS7lU+0di3lE=
869884
k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
870885
k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
886+
k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ=
871887
k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
872888
k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc=
873889
k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4=
890+
k8s.io/kube-openapi v0.0.0-20190722073852-5e22f3d471e6 h1:s9IxTKe9GwDH0S/WaX62nFYr0or32DsTWex9AileL7U=
874891
k8s.io/kube-openapi v0.0.0-20190722073852-5e22f3d471e6/go.mod h1:RZvgC8MSN6DjiMV6oIfEE9pDL9CYXokkfaCKZeHm3nc=
875892
k8s.io/utils v0.0.0-20190221042446-c2654d5206da/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0=
893+
k8s.io/utils v0.0.0-20190809000727-6c36bc71fc4a h1:uy5HAgt4Ha5rEMbhZA+aM1j2cq5LmR6LQ71EYC2sVH4=
876894
k8s.io/utils v0.0.0-20190809000727-6c36bc71fc4a/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
877895
rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE=
878896
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=

pkg/commands/loadgen.go

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
package commands
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"math/rand"
8+
"net/http"
9+
"net/url"
10+
"sync"
11+
"time"
12+
13+
"github.com/gogo/protobuf/proto"
14+
"github.com/golang/snappy"
15+
"github.com/prometheus/client_golang/api"
16+
v1 "github.com/prometheus/client_golang/api/prometheus/v1"
17+
"github.com/prometheus/client_golang/prometheus"
18+
"github.com/prometheus/client_golang/prometheus/promauto"
19+
"github.com/prometheus/client_golang/prometheus/promhttp"
20+
"github.com/prometheus/common/config"
21+
"github.com/prometheus/common/model"
22+
"github.com/prometheus/prometheus/prompb"
23+
"github.com/prometheus/prometheus/storage/remote"
24+
"gopkg.in/alecthomas/kingpin.v2"
25+
)
26+
27+
var writeRequestDuration = promauto.NewHistogramVec(prometheus.HistogramOpts{
28+
Name: "write_request_duration_seconds",
29+
Buckets: prometheus.DefBuckets,
30+
}, []string{"success"})
31+
32+
var queryRequestDuration = promauto.NewHistogramVec(prometheus.HistogramOpts{
33+
Name: "query_request_duration_seconds",
34+
Buckets: prometheus.DefBuckets,
35+
}, []string{"success"})
36+
37+
type LoadgenCommand struct {
38+
writeURL string
39+
activeSeries int
40+
scrapeInterval time.Duration
41+
parallelism int
42+
batchSize int
43+
writeTimeout time.Duration
44+
45+
queryURL string
46+
query string
47+
queryParallelism int
48+
queryTimeout time.Duration
49+
queryDuration time.Duration
50+
51+
metricsListenAddress string
52+
53+
// Runtime stuff.
54+
wg sync.WaitGroup
55+
writeClient *remote.Client
56+
queryClient v1.API
57+
}
58+
59+
func (c *LoadgenCommand) Register(app *kingpin.Application) {
60+
loadgenCommand := &LoadgenCommand{}
61+
cmd := app.Command("loadgen", "Simple load generator for Cortex.").Action(loadgenCommand.run)
62+
cmd.Flag("write-url", "").
63+
Required().StringVar(&loadgenCommand.writeURL)
64+
cmd.Flag("active-series", "number of active series to send").
65+
Default("1000").IntVar(&loadgenCommand.activeSeries)
66+
cmd.Flag("scrape-interval", "period to send metrics").
67+
Default("15s").DurationVar(&loadgenCommand.scrapeInterval)
68+
cmd.Flag("parallelism", "how many metrics to send simultaneously").
69+
Default("10").IntVar(&loadgenCommand.parallelism)
70+
cmd.Flag("batch-size", "how big a batch to send").
71+
Default("100").IntVar(&loadgenCommand.batchSize)
72+
cmd.Flag("write-timeout", "timeout for write requests").
73+
Default("500ms").DurationVar(&loadgenCommand.writeTimeout)
74+
75+
cmd.Flag("query-url", "").
76+
Required().StringVar(&loadgenCommand.queryURL)
77+
cmd.Flag("query", "query to run").
78+
Default("sum(node_cpu_seconds_total)").StringVar(&loadgenCommand.query)
79+
cmd.Flag("query-parallelism", "number of queries to run in parallel").
80+
Default("10").IntVar(&loadgenCommand.queryParallelism)
81+
cmd.Flag("query-timeout", "").
82+
Default("20s").DurationVar(&loadgenCommand.queryTimeout)
83+
cmd.Flag("query-duration", "length of query").
84+
Default("1h").DurationVar(&loadgenCommand.queryDuration)
85+
86+
cmd.Flag("metrics-listen-address", "address to serve metrics on").
87+
Default(":8080").StringVar(&loadgenCommand.metricsListenAddress)
88+
}
89+
90+
func (c *LoadgenCommand) run(k *kingpin.ParseContext) error {
91+
writeURL, err := url.Parse(c.writeURL)
92+
if err != nil {
93+
return err
94+
}
95+
96+
writeClient, err := remote.NewClient(0, &remote.ClientConfig{
97+
URL: &config.URL{URL: writeURL},
98+
Timeout: model.Duration(c.writeTimeout),
99+
})
100+
if err != nil {
101+
return err
102+
}
103+
c.writeClient = writeClient
104+
105+
queryClient, err := api.NewClient(api.Config{
106+
Address: c.queryURL,
107+
})
108+
if err != nil {
109+
return err
110+
}
111+
c.queryClient = v1.NewAPI(queryClient)
112+
113+
http.Handle("/metrics", promhttp.Handler())
114+
go http.ListenAndServe(c.metricsListenAddress, nil)
115+
116+
c.wg.Add(c.parallelism)
117+
c.wg.Add(c.queryParallelism)
118+
119+
metricsPerShard := c.activeSeries / c.parallelism
120+
for i := 0; i < c.activeSeries; i += metricsPerShard {
121+
go c.runWriteShard(i, i+metricsPerShard)
122+
}
123+
124+
for i := 0; i < c.queryParallelism; i++ {
125+
go c.runQueryShard()
126+
}
127+
128+
c.wg.Wait()
129+
return nil
130+
}
131+
132+
func (c *LoadgenCommand) runWriteShard(from, to int) {
133+
defer c.wg.Done()
134+
ticker := time.NewTicker(c.scrapeInterval)
135+
c.runScrape(from, to)
136+
for range ticker.C {
137+
c.runScrape(from, to)
138+
}
139+
}
140+
141+
func (c *LoadgenCommand) runScrape(from, to int) {
142+
for i := from; i < to; i += c.batchSize {
143+
if err := c.runBatch(i, i+c.batchSize); err != nil {
144+
log.Printf("error sending batch: %v", err)
145+
}
146+
}
147+
fmt.Printf("sent %d samples\n", to-from)
148+
}
149+
150+
func (c *LoadgenCommand) runBatch(from, to int) error {
151+
var (
152+
req = prompb.WriteRequest{
153+
Timeseries: make([]prompb.TimeSeries, 0, to-from),
154+
}
155+
now = time.Now().UnixNano() / int64(time.Millisecond)
156+
)
157+
158+
for i := from; i < to; i++ {
159+
timeseries := prompb.TimeSeries{
160+
Labels: []prompb.Label{
161+
{Name: "__name__", Value: "node_cpu_seconds_total"},
162+
{Name: "job", Value: "node_exporter"},
163+
{Name: "instance", Value: fmt.Sprintf("instance%000d", i)},
164+
{Name: "cpu", Value: "0"},
165+
{Name: "mode", Value: "idle"},
166+
},
167+
Samples: []prompb.Sample{{
168+
Timestamp: now,
169+
Value: rand.Float64(),
170+
}},
171+
}
172+
req.Timeseries = append(req.Timeseries, timeseries)
173+
}
174+
175+
data, err := proto.Marshal(&req)
176+
if err != nil {
177+
return err
178+
}
179+
180+
compressed := snappy.Encode(nil, data)
181+
182+
start := time.Now()
183+
if err := c.writeClient.Store(context.Background(), compressed); err != nil {
184+
writeRequestDuration.WithLabelValues("error").Observe(time.Now().Sub(start).Seconds())
185+
return err
186+
}
187+
writeRequestDuration.WithLabelValues("success").Observe(time.Now().Sub(start).Seconds())
188+
189+
return nil
190+
}
191+
192+
func (c *LoadgenCommand) runQueryShard() {
193+
defer c.wg.Done()
194+
for {
195+
c.runQuery()
196+
}
197+
}
198+
199+
func (c *LoadgenCommand) runQuery() {
200+
ctx, cancel := context.WithTimeout(context.Background(), c.queryTimeout)
201+
defer cancel()
202+
r := v1.Range{
203+
Start: time.Now().Add(-c.queryDuration),
204+
End: time.Now(),
205+
Step: time.Minute,
206+
}
207+
start := time.Now()
208+
_, _, err := c.queryClient.QueryRange(ctx, c.query, r)
209+
if err != nil {
210+
queryRequestDuration.WithLabelValues("error").Observe(time.Now().Sub(start).Seconds())
211+
log.Printf("error doing query: %v", err)
212+
return
213+
}
214+
queryRequestDuration.WithLabelValues("success").Observe(time.Now().Sub(start).Seconds())
215+
}

vendor/contrib.go.opencensus.io/exporter/ocagent/.gitignore

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)