github.com/google/cloudprober@v0.11.3/examples/external/redis_probe.go (about) 1 // Copyright 2018 Google Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 /* 16 Binary redis_probe_once implements an example cloudprober external probe that 17 puts a key-value in a redis server, retrieves it and reports time taken for 18 both operations. 19 20 This probe assumes a redis server running on the localhost listening to the 21 default port, 6379. To run it, run the following commands in its parent 22 directory. 23 24 # Build external probe 25 go build ./redis_probe.go 26 27 # Launch cloudprober 28 cloudprober --config_file=cloudprober.cfg 29 30 You should see the following output on the stdout (and corresponding prometheus 31 data on http://localhost:9313/metrics) 32 cloudprober 1519..0 1519583408 labels=ptype=external,probe=redis_probe,dst= success=1 total=1 latency=12143.765 33 cloudprober 1519..1 1519583408 labels=ptype=external,probe=redis_probe,dst= set_latency_ms=0.516 get_latency_ms=0.491 34 cloudprober 1519..2 1519583410 labels=ptype=external,probe=redis_probe,dst= success=2 total=2 latency=30585.915 35 cloudprober 1519..3 1519583410 labels=ptype=external,probe=redis_probe,dst= set_latency_ms=0.636 get_latency_ms=0.994 36 cloudprober 1519..4 1519583412 labels=ptype=external,probe=redis_probe,dst= success=3 total=3 latency=42621.871 37 38 You can also run this probe in server mode by providing "--server" command line 39 flag. 40 */ 41 package main 42 43 import ( 44 "flag" 45 "fmt" 46 "log" 47 "strings" 48 "time" 49 50 "github.com/golang/protobuf/proto" 51 epb "github.com/google/cloudprober/probes/external/proto" 52 "github.com/google/cloudprober/probes/external/serverutils" 53 "github.com/hoisie/redis" 54 ) 55 56 var server = flag.Bool("server", false, "Whether to run in server mode") 57 58 func probe() (string, error) { 59 var payload []string 60 var client redis.Client 61 62 // Measure set latency 63 var key = "hello" 64 startTime := time.Now() 65 err := client.Set(key, []byte("world")) 66 if err != nil { 67 return "", err 68 } 69 70 payload = append(payload, fmt.Sprintf("set_latency_ms %f", float64(time.Since(startTime).Nanoseconds())/1e6)) 71 72 // Measure get latency 73 startTime = time.Now() 74 val, err := client.Get("hello") 75 if err != nil { 76 return strings.Join(payload, "\n"), err 77 } 78 payload = append(payload, fmt.Sprintf("get_latency_ms %f", float64(time.Since(startTime).Nanoseconds())/1e6)) 79 80 log.Printf("%s=%s", key, string(val)) 81 return strings.Join(payload, "\n"), nil 82 } 83 84 func main() { 85 flag.Parse() 86 if *server { 87 serverutils.Serve(func(request *epb.ProbeRequest, reply *epb.ProbeReply) { 88 payload, err := probe() 89 reply.Payload = proto.String(payload) 90 if err != nil { 91 reply.ErrorMessage = proto.String(err.Error()) 92 } 93 }) 94 } 95 payload, err := probe() 96 if err != nil { 97 log.Fatal(err) 98 } 99 fmt.Println(payload) 100 }