| 
									
										
										
										
											2018-11-07 02:19:42 +08:00
										 |  |  | // Copyright 2018 The Prometheus Authors
 | 
					
						
							|  |  |  | // Licensed under the Apache License, Version 2.0 (the "License");
 | 
					
						
							|  |  |  | // you may not use this file except in compliance with the License.
 | 
					
						
							|  |  |  | // You may obtain a copy of the License at
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Unless required by applicable law or agreed to in writing, software
 | 
					
						
							|  |  |  | // distributed under the License is distributed on an "AS IS" BASIS,
 | 
					
						
							|  |  |  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					
						
							|  |  |  | // See the License for the specific language governing permissions and
 | 
					
						
							|  |  |  | // limitations under the License.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-22 18:52:02 +08:00
										 |  |  | package tsdb | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"strconv" | 
					
						
							|  |  |  | 	"sync/atomic" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/prometheus/tsdb/labels" | 
					
						
							|  |  |  | 	"github.com/prometheus/tsdb/testutil" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func BenchmarkHeadStripeSeriesCreate(b *testing.B) { | 
					
						
							|  |  |  | 	// Put a series, select it. GC it and then access it.
 | 
					
						
							|  |  |  | 	h, err := NewHead(nil, nil, nil, 1000) | 
					
						
							|  |  |  | 	testutil.Ok(b, err) | 
					
						
							|  |  |  | 	defer h.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for i := 0; i < b.N; i++ { | 
					
						
							|  |  |  | 		h.getOrCreate(uint64(i), labels.FromStrings("a", strconv.Itoa(i))) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func BenchmarkHeadStripeSeriesCreateParallel(b *testing.B) { | 
					
						
							|  |  |  | 	// Put a series, select it. GC it and then access it.
 | 
					
						
							|  |  |  | 	h, err := NewHead(nil, nil, nil, 1000) | 
					
						
							|  |  |  | 	testutil.Ok(b, err) | 
					
						
							|  |  |  | 	defer h.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var count int64 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	b.RunParallel(func(pb *testing.PB) { | 
					
						
							|  |  |  | 		for pb.Next() { | 
					
						
							|  |  |  | 			i := atomic.AddInt64(&count, 1) | 
					
						
							|  |  |  | 			h.getOrCreate(uint64(i), labels.FromStrings("a", strconv.Itoa(int(i)))) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // TODO: generalize benchmark and pass all postings for matchers here
 | 
					
						
							|  |  |  | func BenchmarkHeadPostingForMatchers(b *testing.B) { | 
					
						
							|  |  |  | 	// Put a series, select it. GC it and then access it.
 | 
					
						
							|  |  |  | 	h, err := NewHead(nil, nil, nil, 1000) | 
					
						
							|  |  |  | 	testutil.Ok(b, err) | 
					
						
							| 
									
										
										
										
											2019-03-01 01:23:55 +08:00
										 |  |  | 	defer func() { | 
					
						
							|  |  |  | 		testutil.Ok(b, h.Close()) | 
					
						
							|  |  |  | 	}() | 
					
						
							| 
									
										
										
										
											2018-10-22 18:52:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-01 01:23:55 +08:00
										 |  |  | 	var hash uint64 | 
					
						
							|  |  |  | 	for n := 0; n < 10; n++ { | 
					
						
							|  |  |  | 		for i := 0; i < 100000; i++ { | 
					
						
							|  |  |  | 			h.getOrCreate(hash, labels.FromStrings("i", strconv.Itoa(i), "n", strconv.Itoa(i), "j", "foo")) | 
					
						
							|  |  |  | 			hash++ | 
					
						
							|  |  |  | 			// Have some series that won't be matched, to properly test inverted matches.
 | 
					
						
							|  |  |  | 			h.getOrCreate(hash, labels.FromStrings("i", strconv.Itoa(i), "n", strconv.Itoa(i), "j", "bar")) | 
					
						
							|  |  |  | 			hash++ | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-10-22 18:52:02 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-01 01:23:55 +08:00
										 |  |  | 	n1 := labels.NewEqualMatcher("n", "1") | 
					
						
							| 
									
										
										
										
											2018-10-22 18:52:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-01 01:23:55 +08:00
										 |  |  | 	jFoo := labels.NewEqualMatcher("j", "foo") | 
					
						
							|  |  |  | 	jNotFoo := labels.Not(jFoo) | 
					
						
							| 
									
										
										
										
											2018-10-22 18:52:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-01 01:23:55 +08:00
										 |  |  | 	iStar := labels.NewMustRegexpMatcher("i", "^.*$") | 
					
						
							|  |  |  | 	iPlus := labels.NewMustRegexpMatcher("i", "^.+$") | 
					
						
							|  |  |  | 	i1Plus := labels.NewMustRegexpMatcher("i", "^1.+$") | 
					
						
							|  |  |  | 	iEmptyRe := labels.NewMustRegexpMatcher("i", "^$") | 
					
						
							|  |  |  | 	iNotEmpty := labels.Not(labels.NewEqualMatcher("i", "")) | 
					
						
							|  |  |  | 	iNot2 := labels.Not(labels.NewEqualMatcher("n", "2")) | 
					
						
							|  |  |  | 	iNot2Star := labels.Not(labels.NewMustRegexpMatcher("i", "^2.*$")) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	cases := []struct { | 
					
						
							|  |  |  | 		name     string | 
					
						
							|  |  |  | 		matchers []labels.Matcher | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{`n="1"`, []labels.Matcher{n1}}, | 
					
						
							|  |  |  | 		{`n="1",j="foo"`, []labels.Matcher{n1, jFoo}}, | 
					
						
							|  |  |  | 		{`j="foo",n="1"`, []labels.Matcher{jFoo, n1}}, | 
					
						
							|  |  |  | 		{`n="1",j!="foo"`, []labels.Matcher{n1, jNotFoo}}, | 
					
						
							|  |  |  | 		{`i=~".*"`, []labels.Matcher{iStar}}, | 
					
						
							|  |  |  | 		{`i=~".+"`, []labels.Matcher{iPlus}}, | 
					
						
							|  |  |  | 		{`i=~""`, []labels.Matcher{iEmptyRe}}, | 
					
						
							|  |  |  | 		{`i!=""`, []labels.Matcher{iNotEmpty}}, | 
					
						
							|  |  |  | 		{`n="1",i=~".*",j="foo"`, []labels.Matcher{n1, iStar, jFoo}}, | 
					
						
							|  |  |  | 		{`n="1",i=~".*",i!="2",j="foo"`, []labels.Matcher{n1, iStar, iNot2, jFoo}}, | 
					
						
							|  |  |  | 		{`n="1",i!="",j="foo"`, []labels.Matcher{n1, iNotEmpty, jFoo}}, | 
					
						
							|  |  |  | 		{`n="1",i=~".+",j="foo"`, []labels.Matcher{n1, iPlus, jFoo}}, | 
					
						
							|  |  |  | 		{`n="1",i=~"1.+",j="foo"`, []labels.Matcher{n1, i1Plus, jFoo}}, | 
					
						
							|  |  |  | 		{`n="1",i=~".+",i!="2",j="foo"`, []labels.Matcher{n1, iPlus, iNot2, jFoo}}, | 
					
						
							|  |  |  | 		{`n="1",i=~".+",i!~"2.*",j="foo"`, []labels.Matcher{n1, iPlus, iNot2Star, jFoo}}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, c := range cases { | 
					
						
							|  |  |  | 		b.Run(c.name, func(b *testing.B) { | 
					
						
							|  |  |  | 			for i := 0; i < b.N; i++ { | 
					
						
							|  |  |  | 				_, err := PostingsForMatchers(h.indexRange(0, 1000), c.matchers...) | 
					
						
							|  |  |  | 				testutil.Ok(b, err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2018-10-22 18:52:02 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } |