@@ -10,6 +10,7 @@ import (
10
10
"net/http"
11
11
"os"
12
12
"path/filepath"
13
+ "runtime"
13
14
"slices"
14
15
"strings"
15
16
"sync"
@@ -1637,8 +1638,9 @@ func (u *userTSDB) releaseAppendLock() {
1637
1638
}
1638
1639
1639
1640
// QueryExemplars implements service.IngesterServer
1640
- func (i * Ingester ) QueryExemplars (ctx context.Context , req * client.ExemplarQueryRequest ) (* client.ExemplarQueryResponse , error ) {
1641
- if err := i .checkRunning (); err != nil {
1641
+ func (i * Ingester ) QueryExemplars (ctx context.Context , req * client.ExemplarQueryRequest ) (resp * client.ExemplarQueryResponse , err error ) {
1642
+ defer recoverIngester (i .logger , & err )
1643
+ if err = i .checkRunning (); err != nil {
1642
1644
return nil , err
1643
1645
}
1644
1646
@@ -1659,7 +1661,7 @@ func (i *Ingester) QueryExemplars(ctx context.Context, req *client.ExemplarQuery
1659
1661
return & client.ExemplarQueryResponse {}, nil
1660
1662
}
1661
1663
1662
- if err : = db .acquireReadLock (); err != nil {
1664
+ if err = db .acquireReadLock (); err != nil {
1663
1665
return & client.ExemplarQueryResponse {}, nil
1664
1666
}
1665
1667
defer db .releaseReadLock ()
@@ -1701,14 +1703,16 @@ func (i *Ingester) QueryExemplars(ctx context.Context, req *client.ExemplarQuery
1701
1703
}
1702
1704
1703
1705
// LabelValues returns all label values that are associated with a given label name.
1704
- func (i * Ingester ) LabelValues (ctx context.Context , req * client.LabelValuesRequest ) (* client.LabelValuesResponse , error ) {
1706
+ func (i * Ingester ) LabelValues (ctx context.Context , req * client.LabelValuesRequest ) (resp * client.LabelValuesResponse , err error ) {
1707
+ defer recoverIngester (i .logger , & err )
1705
1708
resp , cleanup , err := i .labelsValuesCommon (ctx , req )
1706
1709
defer cleanup ()
1707
1710
return resp , err
1708
1711
}
1709
1712
1710
1713
// LabelValuesStream returns all label values that are associated with a given label name.
1711
- func (i * Ingester ) LabelValuesStream (req * client.LabelValuesRequest , stream client.Ingester_LabelValuesStreamServer ) error {
1714
+ func (i * Ingester ) LabelValuesStream (req * client.LabelValuesRequest , stream client.Ingester_LabelValuesStreamServer ) (err error ) {
1715
+ defer recoverIngester (i .logger , & err )
1712
1716
resp , cleanup , err := i .labelsValuesCommon (stream .Context (), req )
1713
1717
defer cleanup ()
1714
1718
@@ -1796,14 +1800,16 @@ func (i *Ingester) labelsValuesCommon(ctx context.Context, req *client.LabelValu
1796
1800
}
1797
1801
1798
1802
// LabelNames return all the label names.
1799
- func (i * Ingester ) LabelNames (ctx context.Context , req * client.LabelNamesRequest ) (* client.LabelNamesResponse , error ) {
1803
+ func (i * Ingester ) LabelNames (ctx context.Context , req * client.LabelNamesRequest ) (resp * client.LabelNamesResponse , err error ) {
1804
+ defer recoverIngester (i .logger , & err )
1800
1805
resp , cleanup , err := i .labelNamesCommon (ctx , req )
1801
1806
defer cleanup ()
1802
1807
return resp , err
1803
1808
}
1804
1809
1805
1810
// LabelNamesStream return all the label names.
1806
- func (i * Ingester ) LabelNamesStream (req * client.LabelNamesRequest , stream client.Ingester_LabelNamesStreamServer ) error {
1811
+ func (i * Ingester ) LabelNamesStream (req * client.LabelNamesRequest , stream client.Ingester_LabelNamesStreamServer ) (err error ) {
1812
+ defer recoverIngester (i .logger , & err )
1807
1813
resp , cleanup , err := i .labelNamesCommon (stream .Context (), req )
1808
1814
defer cleanup ()
1809
1815
@@ -1819,7 +1825,7 @@ func (i *Ingester) LabelNamesStream(req *client.LabelNamesRequest, stream client
1819
1825
resp := & client.LabelNamesStreamResponse {
1820
1826
LabelNames : resp .LabelNames [i :j ],
1821
1827
}
1822
- err : = client .SendLabelNamesStream (stream , resp )
1828
+ err = client .SendLabelNamesStream (stream , resp )
1823
1829
if err != nil {
1824
1830
return err
1825
1831
}
@@ -1891,8 +1897,9 @@ func (i *Ingester) labelNamesCommon(ctx context.Context, req *client.LabelNamesR
1891
1897
}
1892
1898
1893
1899
// MetricsForLabelMatchers returns all the metrics which match a set of matchers.
1894
- func (i * Ingester ) MetricsForLabelMatchers (ctx context.Context , req * client.MetricsForLabelMatchersRequest ) (* client.MetricsForLabelMatchersResponse , error ) {
1895
- result := & client.MetricsForLabelMatchersResponse {}
1900
+ func (i * Ingester ) MetricsForLabelMatchers (ctx context.Context , req * client.MetricsForLabelMatchersRequest ) (result * client.MetricsForLabelMatchersResponse , err error ) {
1901
+ defer recoverIngester (i .logger , & err )
1902
+ result = & client.MetricsForLabelMatchersResponse {}
1896
1903
cleanup , err := i .metricsForLabelMatchersCommon (ctx , req , func (l labels.Labels ) error {
1897
1904
result .Metric = append (result .Metric , & cortexpb.Metric {
1898
1905
Labels : cortexpb .FromLabelsToLabelAdapters (l ),
@@ -1903,7 +1910,8 @@ func (i *Ingester) MetricsForLabelMatchers(ctx context.Context, req *client.Metr
1903
1910
return result , err
1904
1911
}
1905
1912
1906
- func (i * Ingester ) MetricsForLabelMatchersStream (req * client.MetricsForLabelMatchersRequest , stream client.Ingester_MetricsForLabelMatchersStreamServer ) error {
1913
+ func (i * Ingester ) MetricsForLabelMatchersStream (req * client.MetricsForLabelMatchersRequest , stream client.Ingester_MetricsForLabelMatchersStreamServer ) (err error ) {
1914
+ defer recoverIngester (i .logger , & err )
1907
1915
result := & client.MetricsForLabelMatchersStreamResponse {}
1908
1916
1909
1917
cleanup , err := i .metricsForLabelMatchersCommon (stream .Context (), req , func (l labels.Labels ) error {
@@ -1927,7 +1935,7 @@ func (i *Ingester) MetricsForLabelMatchersStream(req *client.MetricsForLabelMatc
1927
1935
1928
1936
// Send last batch
1929
1937
if len (result .Metric ) > 0 {
1930
- err : = client .SendMetricsForLabelMatchersStream (stream , result )
1938
+ err = client .SendMetricsForLabelMatchersStream (stream , result )
1931
1939
if err != nil {
1932
1940
return err
1933
1941
}
@@ -2160,8 +2168,10 @@ const queryStreamBatchMessageSize = 1 * 1024 * 1024
2160
2168
2161
2169
// QueryStream implements service.IngesterServer
2162
2170
// Streams metrics from a TSDB. This implements the client.IngesterServer interface
2163
- func (i * Ingester ) QueryStream (req * client.QueryRequest , stream client.Ingester_QueryStreamServer ) error {
2164
- if err := i .checkRunning (); err != nil {
2171
+ func (i * Ingester ) QueryStream (req * client.QueryRequest , stream client.Ingester_QueryStreamServer ) (err error ) {
2172
+ defer recoverIngester (i .logger , & err )
2173
+
2174
+ if err = i .checkRunning (); err != nil {
2165
2175
return err
2166
2176
}
2167
2177
@@ -3443,3 +3453,20 @@ func (c *labelSetReasonCounters) increment(matchedLabelSetLimits []validation.Li
3443
3453
}
3444
3454
}
3445
3455
}
3456
+
3457
+ func recoverIngester (logger log.Logger , errp * error ) {
3458
+ e := recover ()
3459
+ if e == nil {
3460
+ return
3461
+ }
3462
+
3463
+ switch err := e .(type ) {
3464
+ case runtime.Error :
3465
+ // Print the stack trace but do not inhibit the running application.
3466
+ buf := make ([]byte , 64 << 10 )
3467
+ buf = buf [:runtime .Stack (buf , false )]
3468
+
3469
+ level .Error (logger ).Log ("msg" , "runtime panic in ingester" , "err" , err , "stacktrace" , string (buf ))
3470
+ * errp = errors .Wrap (err , "unexpected error" )
3471
+ }
3472
+ }
0 commit comments