mirror of
https://github.com/hanzoai/traces.git
synced 2026-10-30 18:20:41 +00:00
+6



![dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>](/assets/img/avatar_default.png)





Mario
GitHub
Javier Molina Reyes
Zach Leslie
Joe Elliott
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Ryan Perry
Kim Nylander
Suraj Nath
Alex Bikfalvi
Andrey Karpov
Jennifer Villa
Martin Disibio
Markus Toivonen
Daniel Strobusch
Carles Garcia
835e1fd250
* Block-builder PoC * Add unit test for block-builder (#4289) * Add unit test for block-builder * fmt * Update tests * cmon * Deterministically build blocks for partition sections (#4327) * Pull main (#4342) * chore: remove gofakeit dependency (#4274) * Further reduce Labes() calls in the metrics registry (#4283) * Respect passed headers in read path requests (#4287) * Ingester: Validate completed blocks (#4256) * Add validate method to block Signed-off-by: Joe Elliott <[email protected]> * Add Validate usage in the ingester Signed-off-by: Joe Elliott <[email protected]> * changelog Signed-off-by: Joe Elliott <[email protected]> * add test and fix replay Signed-off-by: Joe Elliott <[email protected]> * increment metric Signed-off-by: Joe Elliott <[email protected]> --------- Signed-off-by: Joe Elliott <[email protected]> * Add `invalid_utf8` to reasons spans could be rejected (#4293) * Add `invalid_utf8` to reasons spans could be rejected * Update changelog * Update docs * Ensure test covers invalid UTF-8 and not slack time * add signals for duplicate rf1 data (#4296) Signed-off-by: Joe Elliott <[email protected]> * Bump anchore/sbom-action from 0.17.5 to 0.17.7 (#4307) Bumps [anchore/sbom-action](https://github.com/anchore/sbom-action) from 0.17.5 to 0.17.7. - [Release notes](https://github.com/anchore/sbom-action/releases) - [Changelog](https://github.com/anchore/sbom-action/blob/main/RELEASE.md) - [Commits](https://github.com/anchore/sbom-action/compare/v0.17.5...v0.17.7) --- updated-dependencies: - dependency-name: anchore/sbom-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * docs: Update readme with explore traces info (#4263) * docs: Update readme with explore traces info Co-authored-by: Kim Nylander <[email protected]> * chore: remove spanlogger (#4312) * chore: remove spanlogger * Query-Frontend: Add middleware to drop headers (#4298) * header strip ware Signed-off-by: Joe Elliott <[email protected]> * comment Signed-off-by: Joe Elliott <[email protected]> * changelog Signed-off-by: Joe Elliott <[email protected]> * remove header strip wear from metrics summary Signed-off-by: Joe Elliott <[email protected]> --------- Signed-off-by: Joe Elliott <[email protected]> * Increase length of time compactions have to fail (#4315) * increase length of time compactions have to fail Signed-off-by: Joe Elliott <[email protected]> * gen Signed-off-by: Joe Elliott <[email protected]> --------- Signed-off-by: Joe Elliott <[email protected]> * docs: mark serverless as deprecated (#4017) * docs: mark serverless as deprecated * Changelog + readme * docs: Remove duplicated examples (#4295) This removes duplicates examples from the Configure TraceQL metrics page. Signed-off-by: Alex Bikfalvi <[email protected]> * tempo-cli: support dropping multiple traces in a single operation (#4266) * tempo-cli: support dropping multiple traces in a single operation * update final log message --------- Co-authored-by: Suraj Nath <[email protected]> * [DOC] Add clarification for metrics summary and traceQL metrics (#4316) * Add clarification for metrics summary and traceQL metrics * Apply suggestions from code review Co-authored-by: Jennifer Villa <[email protected]> * Update docs/sources/tempo/api_docs/metrics-summary.md --------- Co-authored-by: Jennifer Villa <[email protected]> * TraceQL metrics time range fixes (#4325) * Disconnect job time range filtering from step, so that results in split backend/recent range is accurate * changelog * Fix to assert metrics query range before alignment because alignment may increase it, which is not the responsibility of the caller to account for (#4331) * Add doc about configuring TLS with Helm (#4328) * Add doc about configuring TLS with Helm * Add memberlist and readinessProbe to example * Include server config for listening on TLS * Add note about scraping * Update docs/sources/tempo/configuration/network/tls.md Co-authored-by: Markus Toivonen <[email protected]> * Update docs/sources/tempo/configuration/network/tls.md Co-authored-by: Kim Nylander <[email protected]> * Update docs/sources/tempo/configuration/network/tls.md Co-authored-by: Kim Nylander <[email protected]> * Add memcached config for TLS --------- Co-authored-by: Markus Toivonen <[email protected]> Co-authored-by: Kim Nylander <[email protected]> * [DOC] Add TLS info to Helm chart doc (#4334) --------- Signed-off-by: Joe Elliott <[email protected]> Signed-off-by: dependabot[bot] <[email protected]> Signed-off-by: Alex Bikfalvi <[email protected]> Co-authored-by: Javier Molina Reyes <[email protected]> Co-authored-by: Zach Leslie <[email protected]> Co-authored-by: Joe Elliott <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ryan Perry <[email protected]> Co-authored-by: Kim Nylander <[email protected]> Co-authored-by: Suraj Nath <[email protected]> Co-authored-by: Alex Bikfalvi <[email protected]> Co-authored-by: Andrey Karpov <[email protected]> Co-authored-by: Jennifer Villa <[email protected]> Co-authored-by: Martin Disibio <[email protected]> Co-authored-by: Markus Toivonen <[email protected]> * WIP: Rhythm ingest path (#4314) * Validate distributor config. Finish encoder/decoder tests * Repair tests * Make SingleBinary work out of the box by defaulting to partition 0 * Fix first time startup where blockbuilder fails before ingester can create topic * Fix initial startup cycle time and delay * Add more failure modes to the block-builder (#4345) * Add more tests to the block-builder * stuff * Add comments * [Rhythm] Metrics generator read from kafka first pass (#4359) * Metrics generator read from kafka first pass * review feedback * Multiple fixes in block-builder (#4364) * [rhythm] git merge origin/main (#4376) * chore: remove gofakeit dependency (#4274) * Further reduce Labes() calls in the metrics registry (#4283) * Respect passed headers in read path requests (#4287) * Ingester: Validate completed blocks (#4256) * Add validate method to block Signed-off-by: Joe Elliott <[email protected]> * Add Validate usage in the ingester Signed-off-by: Joe Elliott <[email protected]> * changelog Signed-off-by: Joe Elliott <[email protected]> * add test and fix replay Signed-off-by: Joe Elliott <[email protected]> * increment metric Signed-off-by: Joe Elliott <[email protected]> --------- Signed-off-by: Joe Elliott <[email protected]> * Add `invalid_utf8` to reasons spans could be rejected (#4293) * Add `invalid_utf8` to reasons spans could be rejected * Update changelog * Update docs * Ensure test covers invalid UTF-8 and not slack time * add signals for duplicate rf1 data (#4296) Signed-off-by: Joe Elliott <[email protected]> * Bump anchore/sbom-action from 0.17.5 to 0.17.7 (#4307) Bumps [anchore/sbom-action](https://github.com/anchore/sbom-action) from 0.17.5 to 0.17.7. - [Release notes](https://github.com/anchore/sbom-action/releases) - [Changelog](https://github.com/anchore/sbom-action/blob/main/RELEASE.md) - [Commits](https://github.com/anchore/sbom-action/compare/v0.17.5...v0.17.7) --- updated-dependencies: - dependency-name: anchore/sbom-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * docs: Update readme with explore traces info (#4263) * docs: Update readme with explore traces info Co-authored-by: Kim Nylander <[email protected]> * chore: remove spanlogger (#4312) * chore: remove spanlogger * Query-Frontend: Add middleware to drop headers (#4298) * header strip ware Signed-off-by: Joe Elliott <[email protected]> * comment Signed-off-by: Joe Elliott <[email protected]> * changelog Signed-off-by: Joe Elliott <[email protected]> * remove header strip wear from metrics summary Signed-off-by: Joe Elliott <[email protected]> --------- Signed-off-by: Joe Elliott <[email protected]> * Increase length of time compactions have to fail (#4315) * increase length of time compactions have to fail Signed-off-by: Joe Elliott <[email protected]> * gen Signed-off-by: Joe Elliott <[email protected]> --------- Signed-off-by: Joe Elliott <[email protected]> * docs: mark serverless as deprecated (#4017) * docs: mark serverless as deprecated * Changelog + readme * docs: Remove duplicated examples (#4295) This removes duplicates examples from the Configure TraceQL metrics page. Signed-off-by: Alex Bikfalvi <[email protected]> * tempo-cli: support dropping multiple traces in a single operation (#4266) * tempo-cli: support dropping multiple traces in a single operation * update final log message --------- Co-authored-by: Suraj Nath <[email protected]> * [DOC] Add clarification for metrics summary and traceQL metrics (#4316) * Add clarification for metrics summary and traceQL metrics * Apply suggestions from code review Co-authored-by: Jennifer Villa <[email protected]> * Update docs/sources/tempo/api_docs/metrics-summary.md --------- Co-authored-by: Jennifer Villa <[email protected]> * TraceQL metrics time range fixes (#4325) * Disconnect job time range filtering from step, so that results in split backend/recent range is accurate * changelog * Fix to assert metrics query range before alignment because alignment may increase it, which is not the responsibility of the caller to account for (#4331) * Add doc about configuring TLS with Helm (#4328) * Add doc about configuring TLS with Helm * Add memberlist and readinessProbe to example * Include server config for listening on TLS * Add note about scraping * Update docs/sources/tempo/configuration/network/tls.md Co-authored-by: Markus Toivonen <[email protected]> * Update docs/sources/tempo/configuration/network/tls.md Co-authored-by: Kim Nylander <[email protected]> * Update docs/sources/tempo/configuration/network/tls.md Co-authored-by: Kim Nylander <[email protected]> * Add memcached config for TLS --------- Co-authored-by: Markus Toivonen <[email protected]> Co-authored-by: Kim Nylander <[email protected]> * [DOC] Add TLS info to Helm chart doc (#4334) * fix deprecation warning by switching to DoBatchWithOptions (#4343) Signed-off-by: Daniel Strobusch <[email protected]> * bump dskit to v0.0.0-20241115082728-f2a7eb3aa0e9 to leverage benefits for context causes for DoBatch calls. (#4341) See https://github.com/grafana/dskit/issues/576 Signed-off-by: Daniel Strobusch <[email protected]> * Bump github.com/minio/minio-go/v7 from 7.0.70 to 7.0.80 (#4282) * Bump github.com/minio/minio-go/v7 from 7.0.70 to 7.0.80 Bumps [github.com/minio/minio-go/v7](https://github.com/minio/minio-go) from 7.0.70 to 7.0.80. - [Release notes](https://github.com/minio/minio-go/releases) - [Commits](https://github.com/minio/minio-go/compare/v7.0.70...v7.0.80) --- updated-dependencies: - dependency-name: github.com/minio/minio-go/v7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> * Update serverless vendor --------- Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Zach Leslie <[email protected]> * update default config values to better align with production workloads (#4340) * update default config values to better align with production workloads * Update CHANGELOG.md and config docs * Ingester memory improvements by adjusting prealloc (#4344) * remove trace ids Signed-off-by: Joe Elliott <[email protected]> * linear buckets Signed-off-by: Joe Elliott <[email protected]> * changelog Signed-off-by: Joe Elliott <[email protected]> * tuney tune Signed-off-by: Joe Elliott <[email protected]> * metric misses and increase pool size Signed-off-by: Joe Elliott <[email protected]> * lint Signed-off-by: Joe Elliott <[email protected]> --------- Signed-off-by: Joe Elliott <[email protected]> * Bump github.com/Azure/azure-sdk-for-go/sdk/azcore from 1.13.0 to 1.16.0 (#4302) * Bump github.com/Azure/azure-sdk-for-go/sdk/azcore from 1.13.0 to 1.16.0 Bumps [github.com/Azure/azure-sdk-for-go/sdk/azcore](https://github.com/Azure/azure-sdk-for-go) from 1.13.0 to 1.16.0. - [Release notes](https://github.com/Azure/azure-sdk-for-go/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-go/blob/main/documentation/release.md) - [Commits](https://github.com/Azure/azure-sdk-for-go/compare/sdk/azcore/v1.13.0...sdk/azcore/v1.16.0) --- updated-dependencies: - dependency-name: github.com/Azure/azure-sdk-for-go/sdk/azcore dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> * Update serverless vendor --------- Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Zach Leslie <[email protected]> * Use Prometheus fast regexp (#4329) * basic integration Signed-off-by: Joe Elliott <[email protected]> * patch tests for new meaning Signed-off-by: Joe Elliott <[email protected]> * patch up more tests Signed-off-by: Joe Elliott <[email protected]> * add basic tests Signed-off-by: Joe Elliott <[email protected]> * changelog + docs Signed-off-by: Joe Elliott <[email protected]> * remove benches Signed-off-by: Joe Elliott <[email protected]> * Cleaned up + tests Signed-off-by: Joe Elliott <[email protected]> * comment Signed-off-by: Joe Elliott <[email protected]> * lint Signed-off-by: Joe Elliott <[email protected]> * Update docs/sources/tempo/traceql/_index.md Co-authored-by: Kim Nylander <[email protected]> * comment Signed-off-by: Joe Elliott <[email protected]> --------- Signed-off-by: Joe Elliott <[email protected]> Co-authored-by: Kim Nylander <[email protected]> * Fix broken link in service-graphs docs (#4351) * Fix minor typo in TraceQL docs (#4356) * Bump default memcached version (#4363) * Exemplar fixes (#4366) * Fix exemplars based on duration to convert to seconds, fix various other issues * changelog * fix: initialize histogram buckets to 0 to avoid them being downsampled (#4368) * initialized histogram buckets to 0 to avoid them being downsampled * Ingester/Generator Live trace cleanup (#4365) * moved trace sizes somewhere shareable Signed-off-by: Joe Elliott <[email protected]> * use tracesizes in ingester Signed-off-by: Joe Elliott <[email protected]> * make tests work Signed-off-by: Joe Elliott <[email protected]> * trace bytes in generator Signed-off-by: Joe Elliott <[email protected]> * remove traceCount Signed-off-by: Joe Elliott <[email protected]> * live trace shenanigans Signed-off-by: Joe Elliott <[email protected]> * changelog Signed-off-by: Joe Elliott <[email protected]> * Update modules/generator/processor/localblocks/livetraces.go Co-authored-by: Mario <[email protected]> * Update modules/ingester/instance.go Co-authored-by: Mario <[email protected]> * Test cleanup. Add sz test, restore commented out and fix e2e Signed-off-by: Joe Elliott <[email protected]> * remove todo comment Signed-off-by: Joe Elliott <[email protected]> --------- Signed-off-by: Joe Elliott <[email protected]> Co-authored-by: Mario <[email protected]> * Bump anchore/sbom-action from 0.17.7 to 0.17.8 (#4371) Bumps [anchore/sbom-action](https://github.com/anchore/sbom-action) from 0.17.7 to 0.17.8. - [Release notes](https://github.com/anchore/sbom-action/releases) - [Changelog](https://github.com/anchore/sbom-action/blob/main/RELEASE.md) - [Commits](https://github.com/anchore/sbom-action/compare/v0.17.7...v0.17.8) --- updated-dependencies: - dependency-name: anchore/sbom-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update for IDs change * Only run blockbuilder if ingest enabled --------- Signed-off-by: Joe Elliott <[email protected]> Signed-off-by: dependabot[bot] <[email protected]> Signed-off-by: Alex Bikfalvi <[email protected]> Signed-off-by: Daniel Strobusch <[email protected]> Co-authored-by: Javier Molina Reyes <[email protected]> Co-authored-by: Zach Leslie <[email protected]> Co-authored-by: Joe Elliott <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ryan Perry <[email protected]> Co-authored-by: Kim Nylander <[email protected]> Co-authored-by: Suraj Nath <[email protected]> Co-authored-by: Alex Bikfalvi <[email protected]> Co-authored-by: Andrey Karpov <[email protected]> Co-authored-by: Jennifer Villa <[email protected]> Co-authored-by: Martin Disibio <[email protected]> Co-authored-by: Markus Toivonen <[email protected]> Co-authored-by: Daniel Strobusch <[email protected]> Co-authored-by: Carles Garcia <[email protected]> * [rhythm] Changes to simplify operations (#4389) * Use mapping for assigning partitions * Use mapping for assigning partitions in the generator too * Add support for SASL auth to kafka clients * Add metrics to ingest (#4395) * [rhythm] Extract block-builder into its own module (#4396) * Extract block-builder into its own module * Update /operations and examples * No ephemeral storage * No rolling strategy either * fmt and compile * Address review comment * [rhythm] Correctly pass start/end time when appending a trace (#4410) * Correctly pass start/end times * Different code, same result * [rhythm] Multiple fixes to block-builder consumption (#4413) * Multiple fixes to cycle consumption * fmt * happy now? * ups * Rhythm: Separate non-flushing local blocks processor to store new queue data for reads (#4411) * wip: separate non-flushing local blocks processor to store new queue data for reads * Make real config for non-flushing local blocks processor, optional, validate wal config and use defaults if needed * Fix defaulting of second WAL config * [rhythm] Make ID generator more robust (#4416) * Make ID generator more robust * Simplify * Update toc3ff5ba61* Fix registering of kafka read client metrics (#4502) * [rhythm] Make ID generator more robust (#4416) (#4507) * Make ID generator more robust * Simplify * Removed references to Loki and Mimir (#4509) Signed-off-by: Joe Elliott <[email protected]> * [Rhythm] Block builder test updates (#4510) * Make blockbuilder tests closer to real kafka and less implementation specific by always enabling support for consumer groups, call commit control func in order * Verify last committed offset in each test * hide test function * lint * lint * [Rhythm] Block-builder consumption loop (#4480) * Alternate block-builder consume * Set timeout on PollFetches, reduce initial poll delay, update 1 test to work using real consumergroup functionality * restore metrics * Re-add original partition lag metric, polled in separate goroutine. Fix consume loop to only consume full-duration cycles for more determinism * merge conflict * Review feedback * Review feedback * Comment * code cleanup, lint * logs * code cleanup * lint * Review feedback * Remove missed lookback_on_no_commit config in e2e tests and regen manifest * Review feedback * Fix rewind to latest commit to init correctly, it didn't work in some clusters (#4532) * [rhythm] merge main at2c44177(#4531) * Fixes * More fixes --------- Signed-off-by: Joe Elliott <[email protected]> Signed-off-by: dependabot[bot] <[email protected]> Signed-off-by: Alex Bikfalvi <[email protected]> Signed-off-by: Daniel Strobusch <[email protected]> Co-authored-by: Javier Molina Reyes <[email protected]> Co-authored-by: Zach Leslie <[email protected]> Co-authored-by: Joe Elliott <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ryan Perry <[email protected]> Co-authored-by: Kim Nylander <[email protected]> Co-authored-by: Suraj Nath <[email protected]> Co-authored-by: Alex Bikfalvi <[email protected]> Co-authored-by: Andrey Karpov <[email protected]> Co-authored-by: Jennifer Villa <[email protected]> Co-authored-by: Martin Disibio <[email protected]> Co-authored-by: Markus Toivonen <[email protected]> Co-authored-by: Daniel Strobusch <[email protected]> Co-authored-by: Carles Garcia <[email protected]>
206 lines
6.1 KiB
Go
206 lines
6.1 KiB
Go
package kgo
|
|
|
|
import (
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
// NOTE: this code is copied from github.com/twmb/go-strftime, with AppendFormat
|
|
// being unexported.
|
|
|
|
// appendFormat appends t to dst according to the input strftime format.
|
|
//
|
|
// this does not take into account locale; some high level differences:
|
|
//
|
|
// %E and %O are stripped, as well as a single subsequent alpha char
|
|
// %x is DD/MM/YY
|
|
// %c is time.ANSIC
|
|
//
|
|
// In normal strftime, %a, %A, %b, %B, %c, %p, %P, %r, %x, and %X are all
|
|
// affected by locale. This package hardcodes the implementation to mirror
|
|
// LC_TIME=C (minus %x). Every strftime(3) formatter is accounted for.
|
|
func strftimeAppendFormat(dst []byte, format string, t time.Time) []byte {
|
|
for i := 0; i < len(format); i++ {
|
|
c := format[i]
|
|
if c != '%' || i == len(format)-1 {
|
|
dst = append(dst, c)
|
|
continue
|
|
}
|
|
|
|
i++
|
|
c = format[i]
|
|
switch c {
|
|
default:
|
|
dst = append(dst, '%', c)
|
|
case 'a': // abbrev day
|
|
dst = t.AppendFormat(dst, "Mon")
|
|
case 'A': // full day
|
|
dst = t.AppendFormat(dst, "Monday")
|
|
case 'b', 'h': // abbrev month, h is equivalent to b
|
|
dst = t.AppendFormat(dst, "Jan")
|
|
case 'B': // full month
|
|
dst = t.AppendFormat(dst, "January")
|
|
case 'c': // preferred date and time representation
|
|
dst = t.AppendFormat(dst, time.ANSIC)
|
|
case 'C': // century (year/100) as two digit num
|
|
dst = append0Pad(dst, t.Year()/100, 2)
|
|
case 'd': // day of month as two digit num
|
|
dst = append0Pad(dst, t.Day(), 2)
|
|
case 'D': // %m/%d/%y
|
|
dst = append0Pad(dst, int(t.Month()), 2)
|
|
dst = append(dst, '/')
|
|
dst = append0Pad(dst, t.Day(), 2)
|
|
dst = append(dst, '/')
|
|
dst = append0Pad(dst, t.Year()%100, 2)
|
|
case 'e': // day of month as num like %d, but leading 0 is space instead
|
|
dst = appendSpacePad(dst, t.Day())
|
|
case 'E', 'O': // modifier, ignored and skip next (if ascii)
|
|
if i+1 < len(format) {
|
|
next := format[i+1]
|
|
if 'a' <= next && next <= 'z' || 'A' <= next && next <= 'Z' {
|
|
i++
|
|
}
|
|
}
|
|
case 'F': // %Y-%m-%d (iso8601)
|
|
dst = strconv.AppendInt(dst, int64(t.Year()), 10)
|
|
dst = append(dst, '-')
|
|
dst = append0Pad(dst, int(t.Month()), 2)
|
|
dst = append(dst, '-')
|
|
dst = append0Pad(dst, t.Day(), 2)
|
|
case 'G': // iso8601 week-based year
|
|
year, _ := t.ISOWeek()
|
|
dst = append0Pad(dst, year, 4)
|
|
case 'g': // like %G, but two digit year (no century)
|
|
year, _ := t.ISOWeek()
|
|
dst = append0Pad(dst, year%100, 2)
|
|
case 'H': // hour as number on 24hr clock
|
|
dst = append0Pad(dst, t.Hour(), 2)
|
|
case 'I': // hour as number on 12hr clock
|
|
dst = append0Pad(dst, t.Hour()%12, 2)
|
|
case 'j': // day of year as decimal number
|
|
dst = append0Pad(dst, t.YearDay(), 3)
|
|
case 'k': // 24hr as number, space padded
|
|
dst = appendSpacePad(dst, t.Hour())
|
|
case 'l': // 12hr as number, space padded
|
|
dst = appendSpacePad(dst, t.Hour()%12)
|
|
case 'm': // month as number
|
|
dst = append0Pad(dst, int(t.Month()), 2)
|
|
case 'M': // minute as number
|
|
dst = append0Pad(dst, t.Minute(), 2)
|
|
case 'n': // newline
|
|
dst = append(dst, '\n')
|
|
case 'p': // AM or PM
|
|
dst = appendAMPM(dst, t.Hour())
|
|
case 'P': // like %p buf lowercase
|
|
dst = appendampm(dst, t.Hour())
|
|
case 'r': // %I:%M:%S %p
|
|
h := t.Hour()
|
|
dst = append0Pad(dst, h%12, 2)
|
|
dst = append(dst, ':')
|
|
dst = append0Pad(dst, t.Minute(), 2)
|
|
dst = append(dst, ':')
|
|
dst = append0Pad(dst, t.Second(), 2)
|
|
dst = append(dst, ' ')
|
|
dst = appendAMPM(dst, h)
|
|
case 'R': // %H:%M
|
|
dst = append0Pad(dst, t.Hour(), 2)
|
|
dst = append(dst, ':')
|
|
dst = append0Pad(dst, t.Minute(), 2)
|
|
case 's': // seconds since epoch
|
|
dst = strconv.AppendInt(dst, t.Unix(), 10)
|
|
case 'S': // second as number thru 60 for leap second
|
|
dst = append0Pad(dst, t.Second(), 2)
|
|
case 't': // tab
|
|
dst = append(dst, '\t')
|
|
case 'T': // %H:%M:%S
|
|
dst = append0Pad(dst, t.Hour(), 2)
|
|
dst = append(dst, ':')
|
|
dst = append0Pad(dst, t.Minute(), 2)
|
|
dst = append(dst, ':')
|
|
dst = append0Pad(dst, t.Second(), 2)
|
|
case 'u': // day of week as num; Monday is 1
|
|
day := byte(t.Weekday())
|
|
if day == 0 {
|
|
day = 7
|
|
}
|
|
dst = append(dst, '0'+day)
|
|
case 'U': // week number of year starting from first Sunday
|
|
dst = append0Pad(dst, (t.YearDay()-int(t.Weekday())+7)/7, 2)
|
|
case 'V': // iso8601 week number
|
|
_, week := t.ISOWeek()
|
|
dst = append0Pad(dst, week, 2)
|
|
case 'w': // day of week, 0 to 6, Sunday 0
|
|
dst = strconv.AppendInt(dst, int64(t.Weekday()), 10)
|
|
case 'W': // week number of year starting from first Monday
|
|
dst = append0Pad(dst, (t.YearDay()-(int(t.Weekday())+6)%7+7)/7, 2)
|
|
case 'x': // date representation for current locale; we go DD/MM/YY
|
|
dst = append0Pad(dst, t.Day(), 2)
|
|
dst = append(dst, '/')
|
|
dst = append0Pad(dst, int(t.Month()), 2)
|
|
dst = append(dst, '/')
|
|
dst = append0Pad(dst, t.Year()%100, 2)
|
|
case 'X': // time representation for current locale; we go HH:MM:SS
|
|
dst = append0Pad(dst, t.Hour(), 2)
|
|
dst = append(dst, ':')
|
|
dst = append0Pad(dst, t.Minute(), 2)
|
|
dst = append(dst, ':')
|
|
dst = append0Pad(dst, t.Second(), 2)
|
|
case 'y': // year as num without century
|
|
dst = append0Pad(dst, t.Year()%100, 2)
|
|
case 'Y': // year as a num
|
|
dst = append0Pad(dst, t.Year(), 4)
|
|
case 'z': // +hhmm or -hhmm offset from utc
|
|
dst = t.AppendFormat(dst, "-0700")
|
|
case 'Z': // timezone
|
|
dst = t.AppendFormat(dst, "MST")
|
|
case '+': // date and time in date(1) format
|
|
dst = t.AppendFormat(dst, "Mon Jan _2 15:04:05 MST 2006")
|
|
case '%':
|
|
dst = append(dst, '%')
|
|
}
|
|
}
|
|
return dst
|
|
}
|
|
|
|
// all space padded numbers are two length
|
|
func appendSpacePad(p []byte, n int) []byte {
|
|
if n < 10 {
|
|
return append(p, ' ', '0'+byte(n))
|
|
}
|
|
return strconv.AppendInt(p, int64(n), 10)
|
|
}
|
|
|
|
func append0Pad(dst []byte, n, size int) []byte {
|
|
switch size {
|
|
case 4:
|
|
if n < 1000 {
|
|
dst = append(dst, '0')
|
|
}
|
|
fallthrough
|
|
case 3:
|
|
if n < 100 {
|
|
dst = append(dst, '0')
|
|
}
|
|
fallthrough
|
|
case 2:
|
|
if n < 10 {
|
|
dst = append(dst, '0')
|
|
}
|
|
}
|
|
return strconv.AppendInt(dst, int64(n), 10)
|
|
}
|
|
|
|
func appendampm(p []byte, h int) []byte {
|
|
if h < 12 {
|
|
return append(p, 'a', 'm')
|
|
}
|
|
return append(p, 'p', 'm')
|
|
}
|
|
|
|
func appendAMPM(p []byte, h int) []byte {
|
|
if h < 12 {
|
|
return append(p, 'A', 'M')
|
|
}
|
|
return append(p, 'P', 'M')
|
|
}
|