diff --git a/pkg/tsdb/elasticsearch/client/index_pattern.go b/pkg/tsdb/elasticsearch/client/index_pattern.go index ffd87af017c..8bbaabd2935 100644 --- a/pkg/tsdb/elasticsearch/client/index_pattern.go +++ b/pkg/tsdb/elasticsearch/client/index_pattern.go @@ -247,72 +247,97 @@ var datePatternReplacements = map[string]string{ } func formatDate(t time.Time, pattern string) string { - var datePattern string + var formattedDatePatterns []string + var bases []string base := "" - ltr := false + isBaseFirst := false - if strings.HasPrefix(pattern, "[") { - parts := strings.Split(strings.TrimLeft(pattern, "["), "]") - base = parts[0] - if len(parts) == 2 { - datePattern = parts[1] + baseStart := strings.Index(pattern, "[") + for baseStart != -1 { + var datePattern string + + baseEnd := strings.Index(pattern, "]") + base = pattern[baseStart+1 : baseEnd] + bases = append(bases, base) + if baseStart == 0 { + isBaseFirst = true } else { - datePattern = base - base = "" + datePattern = pattern[:baseStart] + formatted := t.Format(patternToLayout(datePattern)) + formattedDatePatterns = append(formattedDatePatterns, formatted) } - ltr = true - } else if strings.HasSuffix(pattern, "]") { - parts := strings.Split(strings.TrimRight(pattern, "]"), "[") - datePattern = parts[0] - if len(parts) == 2 { - base = parts[1] + + if len(pattern) <= baseEnd+1 { + break + } + pattern = pattern[baseEnd+1:] + + baseStart = strings.Index(pattern, "[") + if baseStart == -1 { + datePattern = pattern } else { - base = "" + datePattern = pattern[:baseStart] + pattern = pattern[baseStart:] + baseStart = 0 } - ltr = false + formatted := t.Format(patternToLayout(datePattern)) + formattedDatePatterns = append(formattedDatePatterns, formatted) } - formatted := t.Format(patternToLayout(datePattern)) + isoYear, isoWeek := t.ISOWeek() + isoYearShort := fmt.Sprintf("%d", isoYear)[2:4] + day := t.Weekday() + dayOfWeekIso := int(day) + if day == time.Sunday { + dayOfWeekIso = 7 + } + quarter := 4 + switch t.Month() { + case time.January, time.February, time.March: + quarter = 1 + case time.April, time.May, time.June: + quarter = 2 + case time.July, time.August, time.September: + quarter = 3 + } - if strings.Contains(formatted, "", fmt.Sprintf("%d", isoYear)) formatted = strings.ReplaceAll(formatted, "", isoYearShort) formatted = strings.ReplaceAll(formatted, "", fmt.Sprintf("%02d", isoWeek)) - formatted = strings.ReplaceAll(formatted, "", fmt.Sprintf("%d", t.Unix())) - - day := t.Weekday() - dayOfWeekIso := int(day) - if day == time.Sunday { - dayOfWeekIso = 7 - } - formatted = strings.ReplaceAll(formatted, "", fmt.Sprintf("%d", day)) formatted = strings.ReplaceAll(formatted, "", fmt.Sprintf("%d", dayOfWeekIso)) formatted = strings.ReplaceAll(formatted, "", fmt.Sprintf("%d", t.YearDay())) - - quarter := 4 - - switch t.Month() { - case time.January, time.February, time.March: - quarter = 1 - case time.April, time.May, time.June: - quarter = 2 - case time.July, time.August, time.September: - quarter = 3 - } - formatted = strings.ReplaceAll(formatted, "", fmt.Sprintf("%d", quarter)) formatted = strings.ReplaceAll(formatted, "", fmt.Sprintf("%d", t.Hour())) + + formattedDatePatterns[i] = formatted } - if ltr { - return base + formatted + var fullPattern []string + var i int + + minLen := min(len(formattedDatePatterns), len(bases)) + for i = 0; i < minLen; i++ { + if isBaseFirst { + fullPattern = append(fullPattern, bases[i], formattedDatePatterns[i]) + } else { + fullPattern = append(fullPattern, formattedDatePatterns[i], bases[i]) + } + } + formattedDatePatterns = formattedDatePatterns[i:] + bases = bases[i:] + if len(bases) == 0 { + fullPattern = append(fullPattern, formattedDatePatterns...) + } else { + fullPattern = append(fullPattern, bases...) } - return formatted + base + return strings.Join(fullPattern, "") } func patternToLayout(pattern string) string { @@ -329,3 +354,10 @@ func patternToLayout(pattern string) string { return pattern } + +func min(a, b int) int { + if a < b { + return a + } + return b +} diff --git a/pkg/tsdb/elasticsearch/client/index_pattern_test.go b/pkg/tsdb/elasticsearch/client/index_pattern_test.go index a3a056da04f..bf413fc2605 100644 --- a/pkg/tsdb/elasticsearch/client/index_pattern_test.go +++ b/pkg/tsdb/elasticsearch/client/index_pattern_test.go @@ -77,6 +77,16 @@ func TestIndexPattern(t *testing.T) { So(indices[0], ShouldEqual, "2018-data") }) + indexPatternScenario(intervalDaily, "YYYY[-data-]MM.DD", tsdb.NewTimeRange(from, to), func(indices []string) { + So(indices, ShouldHaveLength, 1) + So(indices[0], ShouldEqual, "2018-data-05.15") + }) + + indexPatternScenario(intervalDaily, "[data-]YYYY[-moredata-]MM.DD", tsdb.NewTimeRange(from, to), func(indices []string) { + So(indices, ShouldHaveLength, 1) + So(indices[0], ShouldEqual, "data-2018-moredata-05.15") + }) + Convey("Should return 01 week", func() { from = fmt.Sprintf("%d", time.Date(2018, 1, 15, 17, 50, 0, 0, time.UTC).UnixNano()/int64(time.Millisecond)) to = fmt.Sprintf("%d", time.Date(2018, 1, 15, 17, 55, 0, 0, time.UTC).UnixNano()/int64(time.Millisecond))