(t *testing.T)
| 438 | } |
| 439 | |
| 440 | func TestPushUTF8(t *testing.T) { |
| 441 | ValidationScheme = model.UTF8Validation |
| 442 | EscapingScheme = model.ValueEncodingEscaping |
| 443 | mms := MockMetricStore{} |
| 444 | handler := Push(&mms, false, true, false, logger) |
| 445 | handlerBase64 := Push(&mms, false, true, true, logger) |
| 446 | |
| 447 | // With job name, instance name, UTF-8 escaped label name in params, UTF-8 metric name and text content. |
| 448 | mms.lastWriteRequest = storage.WriteRequest{} |
| 449 | req, err := http.NewRequest( |
| 450 | "POST", "http://example.org/", |
| 451 | bytes.NewBufferString("some_metric 3.14\n{\"another.metric\",instance=\"testinstance\",job=\"testjob\",\"dotted.label.name\"=\"mylabelvalue\"} 42\n"), |
| 452 | ) |
| 453 | if err != nil { |
| 454 | t.Fatal(err) |
| 455 | } |
| 456 | w := httptest.NewRecorder() |
| 457 | |
| 458 | params := map[string]string{ |
| 459 | "job": "testjob", |
| 460 | "labels": "/instance/testinstance/U__dotted_2e_label_2e_name/mylabelvalue", |
| 461 | } |
| 462 | |
| 463 | handler(w, req.WithContext(ctxWithParams(params, req))) |
| 464 | if expected, got := http.StatusOK, w.Code; expected != got { |
| 465 | t.Errorf("Wanted status code %v, got %v.", expected, got) |
| 466 | } |
| 467 | if mms.lastWriteRequest.Timestamp.IsZero() { |
| 468 | t.Errorf("Write request timestamp not set: %#v", mms.lastWriteRequest) |
| 469 | } |
| 470 | if expected, got := "testjob", mms.lastWriteRequest.Labels["job"]; expected != got { |
| 471 | t.Errorf("Wanted job %v, got %v.", expected, got) |
| 472 | } |
| 473 | if expected, got := "testinstance", mms.lastWriteRequest.Labels["instance"]; expected != got { |
| 474 | t.Errorf("Wanted instance %v, got %v.", expected, got) |
| 475 | } |
| 476 | if expected, got := "mylabelvalue", mms.lastWriteRequest.Labels["dotted.label.name"]; expected != got { |
| 477 | t.Errorf("Wanted dotted.label.name %v, got %v.", expected, got) |
| 478 | } |
| 479 | // Note that sanitation hasn't happened yet, grouping labels not in request. |
| 480 | verifyMetricFamily(t, `name:"some_metric" type:UNTYPED metric:{untyped:{value:3.14}}`, mms.lastWriteRequest.MetricFamilies["some_metric"]) |
| 481 | verifyMetricFamily(t, `name:"another.metric" type:UNTYPED metric:{label:{name:"instance" value:"testinstance"} label:{name:"job" value:"testjob"} label:{name:"dotted.label.name" value:"mylabelvalue"} untyped:{value:42}}`, mms.lastWriteRequest.MetricFamilies["another.metric"]) |
| 482 | |
| 483 | // With base64-encoded label values, UTF-8 escaped label name in params, UTF-8 metric name and text content. |
| 484 | mms.lastWriteRequest = storage.WriteRequest{} |
| 485 | req, err = http.NewRequest( |
| 486 | "POST", "http://example.org/", |
| 487 | bytes.NewBufferString("some_metric 3.14\n{\"another.metric\",instance=\"testinstance\",job=\"testjob\",\"dotted.label.name\"=\"mylabelvalue\"} 42\n"), |
| 488 | ) |
| 489 | if err != nil { |
| 490 | t.Fatal(err) |
| 491 | } |
| 492 | w = httptest.NewRecorder() |
| 493 | params = map[string]string{ |
| 494 | "job": "dGVzdC9qb2I=", // job="test/job" |
| 495 | "labels": "/instance@base64/dGVzdGluc3RhbmNl/U__dotted_2e_label_2e_name@base64/bXlsYWJlbHZhbHVl", // instance="testinstance", dotted.label.name="mylabelvalue" |
| 496 | } |
| 497 | handlerBase64(w, req.WithContext(ctxWithParams(params, req))) |
nothing calls this directly
no test coverage detected
searching dependent graphs…