This repository was archived by the owner on Oct 8, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
104 lines (83 loc) · 2.41 KB
/
main.go
File metadata and controls
104 lines (83 loc) · 2.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package worker
import (
"context"
"errors"
"log"
"os"
"time"
"github.com/googleapis/google-cloudevents-go/cloud/firestore/v1"
"github.com/benchttp/worker/benchttp"
"github.com/benchttp/worker/firestoreconv"
"github.com/benchttp/worker/postgresql"
"github.com/benchttp/worker/stats"
)
// Digest is a Cloud Function triggered by a Firestore create document
// event to extract, compute and store statistics of a Benchttp run.
// It also stores the computed data in a SQL database.
func Digest(ctx context.Context, e firestore.DocumentEventData) error {
r, err := firestoreconv.Report(e.Value)
if err != nil {
return err
}
cfg, err := envConfig()
if err != nil {
return err
}
insertionService, err := postgresql.NewInsertionService(cfg)
if err != nil {
return err
}
codes, times := r.Benchmark.Values()
timestats, err := stats.ComputeCommon(times)
if err != nil {
return err
}
log.Printf("timestats: %s", timestats.StringAsTime())
codestats, err := stats.ComputeStatusDistribution(codes)
if err != nil {
return err
}
log.Printf("codestats: %+v", codestats)
// TO DO: get user id. Using "1" here for the moment.
statsToInsert := buildStats(timestats, codestats, "firestore_id", "1")
if err := insertionService.Insert(statsToInsert); err != nil {
return err
}
return nil
}
func envConfig() (benchttp.Config, error) {
var config benchttp.Config
config.Host = os.Getenv("PSQL_HOST")
if config.Host == "" {
return config, errors.New("PSQL_HOST environment variable not found")
}
config.User = os.Getenv("PSQL_USER")
if config.User == "" {
return config, errors.New("PSQL_USER environment variable not found")
}
config.Password = os.Getenv("PSQL_PASSWORD")
if config.Password == "" {
return config, errors.New("PSQL_PASSWORD environment variable not found")
}
config.DBName = os.Getenv("PSQL_NAME")
if config.DBName == "" {
return config, errors.New("PSQL_NAME environment variable not found")
}
config.IdleConn = 10
config.MaxConn = 25
return config, nil
}
// buildStats builds a benchttp.Stats object.
// Descriptor.FinishedAt is set at time.now().
func buildStats(timestats stats.Common, codestats stats.StatusDistribution, reportID, userID string) benchttp.Stats {
computedstats := benchttp.Stats{
Descriptor: benchttp.StatsDescriptor{
ID: reportID,
UserID: userID,
FinishedAt: time.Now(),
},
Time: timestats,
Code: codestats,
}
return computedstats
}