Skip to content
This repository has been archived by the owner on Apr 2, 2024. It is now read-only.

Commit

Permalink
Switch to Array based interchange instead of JSONB
Browse files Browse the repository at this point in the history
This commit switches the interchange format we use for labels to be two
TEXT[]s instead of a JSONB. This should be a bit more efficient, as we
no longer have to marshal the labels to JSON on the database side, and,
more significantly, have to parse JSON at the adapter.
  • Loading branch information
JLockerman authored and cevian committed Apr 14, 2020
1 parent 5223b98 commit dc5da12
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 141 deletions.
48 changes: 42 additions & 6 deletions pkg/pgmodel/migrate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -555,6 +555,7 @@ func TestSQLJsonLabelArray(t *testing.T) {
for _, ts := range c.metrics {
labelSet := make(model.LabelSet, len(ts.Labels))
metricName := ""
kvMap := make(map[string]string)
keys := make([]string, 0)
values := make([]string, 0)
for _, l := range ts.Labels {
Expand All @@ -564,6 +565,7 @@ func TestSQLJsonLabelArray(t *testing.T) {
labelSet[model.LabelName(l.Name)] = model.LabelValue(l.Value)
keys = append(keys, l.Name)
values = append(values, l.Value)
kvMap[l.Name] = l.Value
}

jsonOrig, err := json.Marshal(labelSet)
Expand Down Expand Up @@ -600,9 +602,6 @@ func TestSQLJsonLabelArray(t *testing.T) {

var jsonres []byte
err = db.QueryRow(context.Background(), "SELECT * FROM prom.label_array_to_jsonb($1)", labelArray).Scan(&jsonres)
if err != nil {
t.Fatal(err)
}
labelSetRes := make(model.LabelSet, len(ts.Labels))
err = json.Unmarshal(jsonres, &labelSetRes)
if err != nil {
Expand All @@ -613,12 +612,33 @@ func TestSQLJsonLabelArray(t *testing.T) {

}

var (
retKeys []string
retVals []string
)
err = db.QueryRow(context.Background(), "SELECT * FROM prom.label_array_to_key_value_array($1)", labelArray).Scan(&retKeys, &retVals)
if err != nil {
t.Fatal(err)
}
if len(retKeys) != len(retVals) {
t.Errorf("invalid kvs, # keys %d, # vals %d", len(retKeys), len(retVals))
}
if len(retKeys) != len(kvMap) {
t.Errorf("invalid kvs, # keys %d, should be %d", len(retKeys), len(kvMap))
}
for i, k := range retKeys {
if kvMap[k] != retVals[i] {
t.Errorf("invalid value for %s\n\tgot\n\t%s\n\twanted\n\t%s", k, retVals[i], kvMap[k])
}
}

// Check the series_id logic
var seriesID int
err = db.QueryRow(context.Background(), "SELECT prom.get_series_id_for_label($1)", jsonOrig).Scan(&seriesID)
if err != nil {
t.Fatal(err)
}

var seriesIDKeyVal int
err = db.QueryRow(context.Background(), "SELECT prom.get_series_id_for_key_value_array($1, $2, $3)", metricName, keys, values).Scan(&seriesIDKeyVal)
if err != nil {
Expand All @@ -627,20 +647,36 @@ func TestSQLJsonLabelArray(t *testing.T) {
if seriesID != seriesIDKeyVal {
t.Fatalf("Expected the series ids to be equal: %v != %v", seriesID, seriesIDKeyVal)
}

err = db.QueryRow(context.Background(), "SELECT prom.label_array_to_jsonb(labels) FROM _prom_catalog.series WHERE id=$1",
seriesID).Scan(&jsonres)
if err != nil {
t.Fatal(err)
}
labelSetRes = make(model.LabelSet, len(ts.Labels))
err = json.Unmarshal(jsonres, &labelSetRes)
if err != nil {
t.Fatal(err)
}

if labelSet.Fingerprint() != labelSetRes.Fingerprint() {
t.Fatalf("Json not equal: got\n%v\nexpected\n%v", string(jsonres), string(jsonOrig))

}

err = db.QueryRow(context.Background(), "SELECT (prom.label_array_to_key_value_array(labels)).* FROM _prom_catalog.series WHERE id=$1",
seriesID).Scan(&retKeys, &retVals)
if err != nil {
t.Fatal(err)
}
if len(retKeys) != len(retVals) {
t.Errorf("invalid kvs, # keys %d, # vals %d", len(retKeys), len(retVals))
}
if len(retKeys) != len(kvMap) {
t.Errorf("invalid kvs, # keys %d, should be %d", len(retKeys), len(kvMap))
}
for i, k := range retKeys {
if kvMap[k] != retVals[i] {
t.Errorf("invalid value for %s\n\tgot\n\t%s\n\twanted\n\t%s", k, retVals[i], kvMap[k])
}
}
}
})
})
Expand Down

0 comments on commit dc5da12

Please sign in to comment.