code: func (b *EtcdBackend) KeepAlive(ctx context.Context, lease backend.Lease, expires time.Time) error {
  	if lease.ID == 0 {
  		return trace.BadParameter("lease is not specified")
  	}
  	re, err := b.client.Get(ctx, prependPrefix(lease.Key), clientv3.WithSerializable(), clientv3.WithKeysOnly())
  	if err != nil {
  		return convertErr(err)
  	}
  	if len(re.Kvs) == 0 {
  		return trace.NotFound("item %q is not found", string(lease.Key))
  	}
  	// instead of keep-alive on the old lease, setup a new lease
  	// because we would like the event to be generated
  	// which does not happen in case of lease keep-alive
  	var opts []clientv3.OpOption
  	var newLease backend.Lease
  	if err := b.setupLease(ctx, backend.Item{Expires: expires}, &newLease, &opts); err != nil {
  		return trace.Wrap(err)
  	}
  	opts = append(opts, clientv3.WithIgnoreValue())
  	kv := re.Kvs[0]
  	_, err = b.client.Put(ctx, string(kv.Key), "", opts...)
  	return convertErr(err)
  }
docs: // KeepAlive updates TTL on the lease ID