func TestRateLimiting(_t *testing.T) { t := NewTailTest("rate-limiting", _t) t.CreateFile("test.txt", "hello\nworld\nagain\nextra\n") config := Config{ Follow: true, RateLimiter: ratelimiter.NewLeakyBucket(2, time.Second)} leakybucketFull := "Too much log activity; waiting a second before resuming tailing" tail := t.StartTail("test.txt", config) // TODO: also verify that tail resumes after the cooloff period. go t.VerifyTailOutput(tail, []string{ "hello", "world", "again", leakybucketFull, "more", "data", leakybucketFull}) // Add more data only after reasonable delay. <-time.After(1200 * time.Millisecond) t.AppendFile("test.txt", "more\ndata\n") // Delete after a reasonable delay, to give tail sufficient time // to read all lines. <-time.After(100 * time.Millisecond) t.RemoveFile("test.txt") // tail.Stop() tail.Cleanup() }
func (i *Tail) translateConfig(original *TailConfig) tail.Config { config := tail.Config{Follow: true, ReOpen: true} if original.MustExist { config.MustExist = true } if original.Poll { config.Poll = true } if original.LimitRate > 0 { config.RateLimiter = ratelimiter.NewLeakyBucket( uint16(original.LimitRate), time.Second, ) } position := i.readPosition() if position > 0 { config.Location = &tail.SeekInfo{Offset: position, Whence: 0} } return config }