Merge pull request #575 from prometheus/beorn7/release

Cut 0.12.0.
This commit is contained in:
Björn Rabenstein 2015-03-04 13:58:57 +01:00
commit 55dcb55498
6 changed files with 69 additions and 19 deletions

View file

@ -1,3 +1,18 @@
## 0.12.0 / 2015-03-04
* [CHANGE] Use client_golang v0.3.1. THIS CHANGES FINGERPRINTING AND INVALIDATES
ALL PERSISTED FINGERPRINTS. You have to wipe your storage to use this or
later versions. There is a version guard in place that will prevent you to
run Prometheus with the stored data of an older Prometheus.
* [BUGFIX] The change above fixes a weakness in the fingerprinting algorithm.
* [ENHANCEMENT] The change above makes fingerprinting faster and less allocation
intensive.
* [FEATURE] OR operator and vector matching options. See docs for details.
* [ENHANCEMENT] Scientific notation and special float values (Inf, NaN) now
supported by the expression language.
* [CHANGE] Dockerfile makes Prometheus use the Docker volume to store data
(rather than /tmp/metrics).
* [CHANGE] Makefile uses Go 1.4.2.
## 0.11.1 / 2015-02-27 ## 0.11.1 / 2015-02-27
* [BUGFIX] Make series maintenance complete again. (Ever since 0.9.0rc4, * [BUGFIX] Make series maintenance complete again. (Ever since 0.9.0rc4,
or commit 0851945, series would not be archived, chunk descriptors would or commit 0851945, series would not be archived, chunk descriptors would

16
Godeps/Godeps.json generated
View file

@ -29,23 +29,23 @@
}, },
{ {
"ImportPath": "github.com/prometheus/client_golang/extraction", "ImportPath": "github.com/prometheus/client_golang/extraction",
"Comment": "0.3.0", "Comment": "0.3.1",
"Rev": "dbbb6c9e1dbb3bf19d0f9a61baa852cbfcee1896" "Rev": "f688948916633c167d810a9548d4b775da43b0b0"
}, },
{ {
"ImportPath": "github.com/prometheus/client_golang/model", "ImportPath": "github.com/prometheus/client_golang/model",
"Comment": "0.3.0", "Comment": "0.3.1",
"Rev": "dbbb6c9e1dbb3bf19d0f9a61baa852cbfcee1896" "Rev": "f688948916633c167d810a9548d4b775da43b0b0"
}, },
{ {
"ImportPath": "github.com/prometheus/client_golang/prometheus", "ImportPath": "github.com/prometheus/client_golang/prometheus",
"Comment": "0.3.0", "Comment": "0.3.1",
"Rev": "dbbb6c9e1dbb3bf19d0f9a61baa852cbfcee1896" "Rev": "f688948916633c167d810a9548d4b775da43b0b0"
}, },
{ {
"ImportPath": "github.com/prometheus/client_golang/text", "ImportPath": "github.com/prometheus/client_golang/text",
"Comment": "0.3.0", "Comment": "0.3.1",
"Rev": "dbbb6c9e1dbb3bf19d0f9a61baa852cbfcee1896" "Rev": "f688948916633c167d810a9548d4b775da43b0b0"
}, },
{ {
"ImportPath": "github.com/prometheus/client_model/go", "ImportPath": "github.com/prometheus/client_model/go",

View file

@ -17,6 +17,7 @@ import (
"bytes" "bytes"
"hash" "hash"
"hash/fnv" "hash/fnv"
"sync"
) )
// SeparatorByte is a byte that cannot occur in valid UTF-8 sequences and is // SeparatorByte is a byte that cannot occur in valid UTF-8 sequences and is
@ -28,7 +29,7 @@ var (
// cache the signature of an empty label set. // cache the signature of an empty label set.
emptyLabelSignature = fnv.New64a().Sum64() emptyLabelSignature = fnv.New64a().Sum64()
hashAndBufPool = make(chan *hashAndBuf, 1024) hashAndBufPool sync.Pool
) )
type hashAndBuf struct { type hashAndBuf struct {
@ -37,19 +38,15 @@ type hashAndBuf struct {
} }
func getHashAndBuf() *hashAndBuf { func getHashAndBuf() *hashAndBuf {
select { hb := hashAndBufPool.Get()
case hb := <-hashAndBufPool: if hb == nil {
return hb
default:
return &hashAndBuf{h: fnv.New64a()} return &hashAndBuf{h: fnv.New64a()}
} }
return hb.(*hashAndBuf)
} }
func putHashAndBuf(hb *hashAndBuf) { func putHashAndBuf(hb *hashAndBuf) {
select { hashAndBufPool.Put(hb)
case hashAndBufPool <- hb:
default:
}
} }
// LabelsToSignature returns a unique signature (i.e., fingerprint) for a given // LabelsToSignature returns a unique signature (i.e., fingerprint) for a given

View file

@ -15,6 +15,7 @@ package model
import ( import (
"runtime" "runtime"
"sync"
"testing" "testing"
) )
@ -216,3 +217,40 @@ func TestEmptyLabelSignature(t *testing.T) {
t.Fatal("expected LabelsToSignature with empty labels not to perform allocations") t.Fatal("expected LabelsToSignature with empty labels not to perform allocations")
} }
} }
func benchmarkMetricToFingerprintConc(b *testing.B, m Metric, e Fingerprint, concLevel int) {
var start, end sync.WaitGroup
start.Add(1)
end.Add(concLevel)
for i := 0; i < concLevel; i++ {
go func() {
start.Wait()
for j := b.N / concLevel; j >= 0; j-- {
if a := metricToFingerprint(m); a != e {
b.Fatalf("expected signature of %d for %s, got %d", e, m, a)
}
}
end.Done()
}()
}
b.ResetTimer()
start.Done()
end.Wait()
}
func BenchmarkMetricToFingerprintTripleConc1(b *testing.B) {
benchmarkMetricToFingerprintConc(b, Metric{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 1)
}
func BenchmarkMetricToFingerprintTripleConc2(b *testing.B) {
benchmarkMetricToFingerprintConc(b, Metric{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 2)
}
func BenchmarkMetricToFingerprintTripleConc4(b *testing.B) {
benchmarkMetricToFingerprintConc(b, Metric{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 4)
}
func BenchmarkMetricToFingerprintTripleConc8(b *testing.B) {
benchmarkMetricToFingerprintConc(b, Metric{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 8)
}

View file

@ -385,7 +385,7 @@ request_duration_microseconds_count 2693
}, },
}, },
}, },
}, },
} }
for i, scenario := range scenarios { for i, scenario := range scenarios {

View file

@ -1 +1 @@
0.11.1 0.12.0