Пример #1
0
func runTail(ctx *cli.Context) {
	var duration time.Duration
	var err error
	if ctx.String("duration") != "" {
		duration, err = time.ParseDuration(ctx.String("duration"))
		if err != nil {
			panic(err)
		}
	}
	k, err := kinesumer.NewDefault(
		ctx.String("stream"),
		duration,
	)
	if err != nil {
		panic(err)
	}

	k.Options.ErrHandler = kinesumer.ErrHandler(errHandler)

	if redisURL := ctx.String(fRedisURL); len(redisURL) > 0 {
		pool, err := redispool.NewRedisPool(redisURL)
		if err != nil {
			panic(err)
		}

		cp, err := redischeckpointer.New(&redischeckpointer.Options{
			ReadOnly:    true,
			RedisPool:   pool,
			RedisPrefix: ctx.String(fRedisPrefix),
		})
		if err != nil {
			panic(err)
		}

		k.Checkpointer = cp
	}

	_, err = k.Begin()
	if err != nil {
		panic(err)
	}
	defer k.End()

	r := kinesumer.NewReader(k.Records())
	io.Copy(os.Stdout, r)
}
Пример #2
0
func (s *kinesisLogsStreamer) StreamLogs(app *App, w io.Writer) error {
	k, err := kinesumer.NewDefault(app.ID)
	if err != nil {
		return err
	}

	_, err = k.Begin()
	if err != nil {
		return err
	}
	defer k.End()

	for {
		rec := <-k.Records()
		msg := append(rec.Data(), '\n')
		if _, err := w.Write(msg); err != nil {
			return err
		}
	}
}
Пример #3
0
func (s *KinesisLogsStreamer) StreamLogs(app *App, w io.Writer, duration time.Duration) error {
	k, err := kinesumer.NewDefault(app.ID, duration)
	if err != nil {
		return fmt.Errorf("error initializing kinesumer: %v", err)
	}

	_, err = k.Begin()
	if err != nil {
		return fmt.Errorf("error starting kinesumer: %v", err)
	}
	defer k.End()

	for {
		rec := <-k.Records()
		msg := append(rec.Data(), '\n')
		if _, err := w.Write(msg); err != nil {
			return fmt.Errorf("error writing kinesis record to log stream: %v", err)
		}
	}
}
Пример #4
0
func runTail(ctx *cli.Context) {
	k, err := kinesumer.NewDefault(
		ctx.String("stream"),
	)
	if err != nil {
		panic(err)
	}

	k.Options.ErrHandler = ErrHandler

	if redisURL := ctx.String(fRedisURL); len(redisURL) > 0 {
		pool, err := redispool.NewRedisPool(redisURL)
		if err != nil {
			panic(err)
		}

		cp, err := redischeckpointer.New(&redischeckpointer.Options{
			ReadOnly:    true,
			RedisPool:   pool,
			RedisPrefix: ctx.String(fRedisPrefix),
		})
		if err != nil {
			panic(err)
		}

		k.Checkpointer = cp
	}

	_, err = k.Begin()
	if err != nil {
		panic(err)
	}
	defer k.End()
	for {
		rec := <-k.Records()
		fmt.Println(string(rec.Data()))
	}
}
Пример #5
0
func runStatus(ctx *cli.Context) {
	k, err := kinesumer.NewDefault(
		getStream(ctx),
		time.Duration(0),
	)
	if err != nil {
		panic(err)
	}

	var prov *redisprovisioner.Provisioner
	var cp *redischeckpointer.Checkpointer
	redis := false
	if redisURL := ctx.String(fRedisURL); len(redisURL) > 0 {
		pool, err := redispool.NewRedisPool(redisURL)
		if err != nil {
			panic(err)
		}
		prefix := ctx.String(fRedisPrefix)

		prov, err = redisprovisioner.New(&redisprovisioner.Options{
			TTL:         time.Second,
			RedisPool:   pool,
			RedisPrefix: prefix,
		})
		if err != nil {
			panic(err)
		}

		cp, err = redischeckpointer.New(&redischeckpointer.Options{
			ReadOnly:    true,
			RedisPool:   pool,
			RedisPrefix: prefix,
		})

		err = cp.Begin()
		if err != nil {
			panic(err)
		}
		defer cp.End()

		redis = true
	}

	table := NewTable()
	header := table.AddRowWith("Shard ID", "Status")
	header.Header = true
	if redis {
		header.AddCellWithf("Worker")
		header.AddCellWithf("Sequence Number")
	}

	shards, err := k.GetShards()
	if err != nil {
		panic(err)
	}

	for _, shard := range shards {
		row := table.AddRow()
		row.AddCellWithf("%s", *shard.ShardId)
		if shard.SequenceNumberRange.EndingSequenceNumber == nil {
			row.AddCellWithf("OPEN").Color = color.New(color.FgGreen)
		} else {
			row.AddCellWithf("CLOSED").Color = color.New(color.FgRed)
		}
		if redis {
			cell := row.AddCell()
			lock, err := prov.Check(*shard.ShardId)
			if err != nil {
				lock = err.Error()
				cell.Color = color.New(color.FgRed)
			}
			cell.Printf("%s", lock)
			seqStart := StrShorten(cp.GetStartSequence(*shard.ShardId), 8, 8)
			cell = row.AddCell()
			if len(seqStart) == 0 {
				seqStart = "???"
				cell.Color = color.New(color.FgRed)
			}
			cell.Printf("%s", seqStart)
		}
	}

	table.Done()
}
Пример #6
0
func runShards(ctx *cli.Context) {
	stream := getStream(ctx)
	k, err := kinesumer.NewDefault(
		stream,
		time.Duration(0),
	)
	if err != nil {
		panic(err)
	}

	shards, err := k.GetShards()
	if err != nil {
		panic(err)
	}
	if len(shards) == 0 {
		fmt.Printf("No shards found on stream %s\n", stream)
	}

	keys := make(ShardHashEndpoints, 0)

	for _, shard := range shards {
		begin := &big.Int{}
		begin.SetString(*shard.HashKeyRange.StartingHashKey, 10)
		keys = append(keys, begin)

		end := &big.Int{}
		end.SetString(*shard.HashKeyRange.EndingHashKey, 10)
		end.Add(end, big.NewInt(1))
		keys = append(keys, end)
	}

	keys.UniqSort()

	// Only support < 100 shards for now
	maxShardIdLen := 0
	for _, shard := range shards {
		if maxShardIdLen < len(*shard.ShardId) {
			maxShardIdLen = len(*shard.ShardId)
		}
	}

	fmt.Printf("SHARD ID%s  ", strings.Repeat(" ", maxShardIdLen-len("SHARD ID")))
	for i := 0; i < len(keys); i++ {
		if i < 10 {
			fmt.Printf("%d  ", i)
		} else {
			fmt.Printf("%d ", i)
		}
	}
	fmt.Println()

	for _, shard := range shards {
		fmt.Printf("%s%s  ", *shard.ShardId, strings.Repeat(" ", maxShardIdLen-len(*shard.ShardId)))
		for _, key := range keys {
			begin := &big.Int{}
			begin.SetString(*shard.HashKeyRange.StartingHashKey, 10)
			if key.Cmp(begin) < 0 {
				fmt.Printf("   ")
				continue
			}
			end := &big.Int{}
			end.SetString(*shard.HashKeyRange.EndingHashKey, 10)
			end.Add(end, big.NewInt(1))
			if key.Cmp(end) < 0 {
				fmt.Printf("o--")
			} else {
				fmt.Printf("o\n")
				break
			}
		}
	}
	fmt.Printf("\nHash keys:\n")
	for i, key := range keys {
		fmt.Printf("%d: %s\n", i, key.String())
	}
}