(ctx context.Context, userID string, req *client.ExemplarQueryRequest)
| 1818 | } |
| 1819 | |
| 1820 | func (i *Ingester) queryExemplars(ctx context.Context, userID string, req *client.ExemplarQueryRequest) (*client.ExemplarQueryResponse, error) { |
| 1821 | from, through, matchers, err := client.FromExemplarQueryRequest(i.matchersCache, req) |
| 1822 | if err != nil { |
| 1823 | return nil, err |
| 1824 | } |
| 1825 | |
| 1826 | i.metrics.queries.Inc() |
| 1827 | |
| 1828 | db, err := i.getTSDB(userID) |
| 1829 | if err != nil || db == nil { |
| 1830 | return &client.ExemplarQueryResponse{}, nil |
| 1831 | } |
| 1832 | |
| 1833 | if err = db.acquireReadLock(); err != nil { |
| 1834 | return &client.ExemplarQueryResponse{}, nil |
| 1835 | } |
| 1836 | defer db.releaseReadLock() |
| 1837 | |
| 1838 | q, err := db.ExemplarQuerier(ctx) |
| 1839 | if err != nil { |
| 1840 | return nil, err |
| 1841 | } |
| 1842 | |
| 1843 | // We will report *this* request in the error too. |
| 1844 | c, err := i.trackInflightQueryRequest() |
| 1845 | if err != nil { |
| 1846 | return nil, err |
| 1847 | } |
| 1848 | |
| 1849 | // It's not required to sort series from a single ingester because series are sorted by the Exemplar Storage before returning from Select. |
| 1850 | res, err := q.Select(from, through, matchers...) |
| 1851 | c() |
| 1852 | if err != nil { |
| 1853 | return nil, err |
| 1854 | } |
| 1855 | |
| 1856 | numExemplars := 0 |
| 1857 | |
| 1858 | result := &client.ExemplarQueryResponse{} |
| 1859 | for _, es := range res { |
| 1860 | ts := cortexpb.TimeSeries{ |
| 1861 | Labels: cortexpb.FromLabelsToLabelAdapters(es.SeriesLabels), |
| 1862 | Exemplars: cortexpb.FromExemplarsToExemplarProtos(es.Exemplars), |
| 1863 | } |
| 1864 | |
| 1865 | numExemplars += len(ts.Exemplars) |
| 1866 | result.Timeseries = append(result.Timeseries, ts) |
| 1867 | } |
| 1868 | |
| 1869 | i.metrics.queriedExemplars.Observe(float64(numExemplars)) |
| 1870 | |
| 1871 | return result, nil |
| 1872 | } |
| 1873 | |
| 1874 | // LabelValues returns all label values that are associated with a given label name. |
| 1875 | func (i *Ingester) LabelValues(ctx context.Context, req *client.LabelValuesRequest) (resp *client.LabelValuesResponse, err error) { |
no test coverage detected