Repository: numaproj/numaflow

Issue:
Expose APIs for fetching error state per pod from the UI server


Hints from issue comments:

Solution patch:
diff --git a/USERS.md b/USERS.md
index d5d2b81c..87cd2cfc 100644
--- a/USERS.md
+++ b/USERS.md
@@ -10,3 +10,4 @@ Please add your company name and initial use case (optional) below.
 6. [Seekr](https://www.seekr.com/) Numaflow coordinates multiple ML pipelines to rate and extract information from the pipeline input.
 7. [BEUMER Group](https://www.beumergroup.com/) - Signal processing for IoT-sensors, providing predictive maintenance solutions for the Intra-logistics sector.
 8. [NTT](https://www.rd.ntt/e/) - AI/ML pipeline for realizing Accelerator Chaining. Presented at KubeCon EU 25.
+9. [QualiBooth](https://www.qualibooth.com/) - Accessibility-focused software. It leverages Numaflow pipelines to aggregate real-time data related to web accessibility issues.
diff --git a/pkg/apis/proto/daemon/daemon.pb.go b/pkg/apis/proto/daemon/daemon.pb.go
index 6cb88c9f..b62054c7 100644
--- a/pkg/apis/proto/daemon/daemon.pb.go
+++ b/pkg/apis/proto/daemon/daemon.pb.go
@@ -26,6 +26,7 @@ import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	_ "google.golang.org/protobuf/types/known/emptypb"
+	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
 	wrapperspb "google.golang.org/protobuf/types/known/wrapperspb"
 	reflect "reflect"
 	sync "sync"
@@ -864,6 +865,246 @@ func (x *GetPipelineWatermarksRequest) GetPipeline() string {
 	return ""
 }
 
+// GetVertexErrorsRequest is a request message for retrieving the errors for a vertex.
+type GetVertexErrorsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Pipeline string `protobuf:"bytes,1,opt,name=pipeline,proto3" json:"pipeline,omitempty"`
+	Vertex   string `protobuf:"bytes,2,opt,name=vertex,proto3" json:"vertex,omitempty"`
+}
+
+func (x *GetVertexErrorsRequest) Reset() {
+	*x = GetVertexErrorsRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_pkg_apis_proto_daemon_daemon_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetVertexErrorsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetVertexErrorsRequest) ProtoMessage() {}
+
+func (x *GetVertexErrorsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_pkg_apis_proto_daemon_daemon_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetVertexErrorsRequest.ProtoReflect.Descriptor instead.
+func (*GetVertexErrorsRequest) Descriptor() ([]byte, []int) {
+	return file_pkg_apis_proto_daemon_daemon_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *GetVertexErrorsRequest) GetPipeline() string {
+	if x != nil {
+		return x.Pipeline
+	}
+	return ""
+}
+
+func (x *GetVertexErrorsRequest) GetVertex() string {
+	if x != nil {
+		return x.Vertex
+	}
+	return ""
+}
+
+// ContainerError is used to provide information for a container error
+// including timestamp, error code, message and details
+type ContainerError struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Container string                 `protobuf:"bytes,1,opt,name=container,proto3" json:"container,omitempty"`
+	Timestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+	Code      string                 `protobuf:"bytes,3,opt,name=code,proto3" json:"code,omitempty"`
+	Message   string                 `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"`
+	Details   string                 `protobuf:"bytes,5,opt,name=details,proto3" json:"details,omitempty"`
+}
+
+func (x *ContainerError) Reset() {
+	*x = ContainerError{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_pkg_apis_proto_daemon_daemon_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ContainerError) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ContainerError) ProtoMessage() {}
+
+func (x *ContainerError) ProtoReflect() protoreflect.Message {
+	mi := &file_pkg_apis_proto_daemon_daemon_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ContainerError.ProtoReflect.Descriptor instead.
+func (*ContainerError) Descriptor() ([]byte, []int) {
+	return file_pkg_apis_proto_daemon_daemon_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *ContainerError) GetContainer() string {
+	if x != nil {
+		return x.Container
+	}
+	return ""
+}
+
+func (x *ContainerError) GetTimestamp() *timestamppb.Timestamp {
+	if x != nil {
+		return x.Timestamp
+	}
+	return nil
+}
+
+func (x *ContainerError) GetCode() string {
+	if x != nil {
+		return x.Code
+	}
+	return ""
+}
+
+func (x *ContainerError) GetMessage() string {
+	if x != nil {
+		return x.Message
+	}
+	return ""
+}
+
+func (x *ContainerError) GetDetails() string {
+	if x != nil {
+		return x.Details
+	}
+	return ""
+}
+
+// ReplicaErrors is used to provide all the container errors for a replica
+type ReplicaErrors struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica         string            `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+	ContainerErrors []*ContainerError `protobuf:"bytes,2,rep,name=containerErrors,proto3" json:"containerErrors,omitempty"`
+}
+
+func (x *ReplicaErrors) Reset() {
+	*x = ReplicaErrors{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_pkg_apis_proto_daemon_daemon_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaErrors) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaErrors) ProtoMessage() {}
+
+func (x *ReplicaErrors) ProtoReflect() protoreflect.Message {
+	mi := &file_pkg_apis_proto_daemon_daemon_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaErrors.ProtoReflect.Descriptor instead.
+func (*ReplicaErrors) Descriptor() ([]byte, []int) {
+	return file_pkg_apis_proto_daemon_daemon_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *ReplicaErrors) GetReplica() string {
+	if x != nil {
+		return x.Replica
+	}
+	return ""
+}
+
+func (x *ReplicaErrors) GetContainerErrors() []*ContainerError {
+	if x != nil {
+		return x.ContainerErrors
+	}
+	return nil
+}
+
+type GetVertexErrorsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Errors []*ReplicaErrors `protobuf:"bytes,1,rep,name=errors,proto3" json:"errors,omitempty"`
+}
+
+func (x *GetVertexErrorsResponse) Reset() {
+	*x = GetVertexErrorsResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_pkg_apis_proto_daemon_daemon_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetVertexErrorsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetVertexErrorsResponse) ProtoMessage() {}
+
+func (x *GetVertexErrorsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_pkg_apis_proto_daemon_daemon_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetVertexErrorsResponse.ProtoReflect.Descriptor instead.
+func (*GetVertexErrorsResponse) Descriptor() ([]byte, []int) {
+	return file_pkg_apis_proto_daemon_daemon_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *GetVertexErrorsResponse) GetErrors() []*ReplicaErrors {
+	if x != nil {
+		return x.Errors
+	}
+	return nil
+}
+
 var File_pkg_apis_proto_daemon_daemon_proto protoreflect.FileDescriptor
 
 var file_pkg_apis_proto_daemon_daemon_proto_rawDesc = []byte{
@@ -875,179 +1116,218 @@ var file_pkg_apis_proto_daemon_daemon_proto_rawDesc = []byte{
 	0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74,
 	0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
-	0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x92, 0x04, 0x0a, 0x0a, 0x42, 0x75, 0x66, 0x66,
-	0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69,
-	0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69,
-	0x6e, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4e, 0x61,
-	0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75,
-	0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34,
-	0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f,
-	0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x0f, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e,
-	0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67,
-	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49,
-	0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x61, 0x63, 0x6b, 0x50, 0x65,
-	0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x74, 0x6f,
-	0x74, 0x61, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d,
-	0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x3f, 0x0a,
-	0x0c, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x06, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65,
-	0x52, 0x0c, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x48,
-	0x0a, 0x10, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x55, 0x73, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x6d,
-	0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c,
-	0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x55, 0x73,
-	0x61, 0x67, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x3e, 0x0a, 0x0b, 0x62, 0x75, 0x66, 0x66,
-	0x65, 0x72, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
+	0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x92, 0x04, 0x0a, 0x0a, 0x42, 0x75, 0x66,
+	0x66, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c,
+	0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c,
+	0x69, 0x6e, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4e, 0x61, 0x6d,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4e,
+	0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f,
+	0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36,
+	0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43,
+	0x6f, 0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x0f, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x6e, 0x64, 0x69,
+	0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e,
 	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x62, 0x75, 0x66,
-	0x66, 0x65, 0x72, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x69, 0x73, 0x46, 0x75,
-	0x6c, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56,
-	0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x69, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x22, 0x96, 0x03, 0x0a,
-	0x0d, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x1a,
-	0x0a, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x65,
-	0x72, 0x74, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x65, 0x72, 0x74,
-	0x65, 0x78, 0x12, 0x54, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67,
-	0x52, 0x61, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x64, 0x61,
+	0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x61, 0x63, 0x6b, 0x50,
+	0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x74,
+	0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,
+	0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x3f,
+	0x0a, 0x0c, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x06,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x52, 0x0c, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12,
+	0x48, 0x0a, 0x10, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x55, 0x73, 0x61, 0x67, 0x65, 0x4c, 0x69,
+	0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62,
+	0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x55,
+	0x73, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x3e, 0x0a, 0x0b, 0x62, 0x75, 0x66,
+	0x66, 0x65, 0x72, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
+	0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x62, 0x75,
+	0x66, 0x66, 0x65, 0x72, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x69, 0x73, 0x46,
+	0x75, 0x6c, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x69, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x22, 0x96, 0x03,
+	0x0a, 0x0d, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12,
+	0x1a, 0x0a, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76,
+	0x65, 0x72, 0x74, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x65, 0x72,
+	0x74, 0x65, 0x78, 0x12, 0x54, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e,
+	0x67, 0x52, 0x61, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x64,
+	0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72,
+	0x69, 0x63, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x61,
+	0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73,
+	0x73, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x08, 0x70, 0x65, 0x6e,
+	0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x61,
 	0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69,
-	0x63, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74,
-	0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,
-	0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x08, 0x70, 0x65, 0x6e, 0x64,
-	0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x61, 0x65,
-	0x6d, 0x6f, 0x6e, 0x2e, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63,
-	0x73, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52,
-	0x08, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x60, 0x0a, 0x14, 0x50, 0x72, 0x6f,
-	0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72,
-	0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
-	0x6b, 0x65, 0x79, 0x12, 0x32, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65,
-	0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0d, 0x50,
-	0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,
-	0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x31,
-	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e,
-	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
-	0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x56, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e,
-	0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
-	0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64,
-	0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x30, 0x0a,
-	0x12, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x22,
-	0x43, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72,
-	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e,
-	0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x62, 0x75, 0x66,
-	0x66, 0x65, 0x72, 0x73, 0x22, 0x46, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65,
-	0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x69, 0x70, 0x65,
-	0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x69, 0x70, 0x65,
-	0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x3f, 0x0a, 0x11,
-	0x47, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x12, 0x2a, 0x0a, 0x06, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x12, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65,
-	0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x36, 0x0a,
-	0x18, 0x47, 0x65, 0x74, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74,
-	0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x69, 0x70,
+	0x63, 0x73, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x52, 0x08, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x60, 0x0a, 0x14, 0x50, 0x72,
+	0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74,
+	0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x03, 0x6b, 0x65, 0x79, 0x12, 0x32, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0d,
+	0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a,
+	0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,
+	0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
+	0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x56, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69,
+	0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f,
+	0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x30,
+	0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65,
+	0x22, 0x43, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x62, 0x75, 0x66, 0x66, 0x65,
+	0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f,
+	0x6e, 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x62, 0x75,
+	0x66, 0x66, 0x65, 0x72, 0x73, 0x22, 0x46, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66,
+	0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x69, 0x70,
 	0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x69, 0x70,
-	0x65, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x4b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x50, 0x69, 0x70, 0x65,
-	0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x16, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x50, 0x69, 0x70, 0x65,
-	0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74,
-	0x75, 0x73, 0x22, 0x4d, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d,
-	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a,
-	0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x65, 0x72,
-	0x74, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x65, 0x72, 0x74, 0x65,
-	0x78, 0x22, 0x57, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65,
-	0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a,
-	0x0d, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x56, 0x65,
-	0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0d, 0x76, 0x65, 0x72,
-	0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xec, 0x01, 0x0a, 0x0d, 0x45,
-	0x64, 0x67, 0x65, 0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x1a, 0x0a, 0x08,
-	0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
-	0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x64, 0x67, 0x65,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x64, 0x67, 0x65, 0x12, 0x3b, 0x0a, 0x0a,
-	0x77, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b,
-	0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
-	0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x77,
-	0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x4a, 0x0a, 0x12, 0x69, 0x73, 0x57,
-	0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18,
-	0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75,
-	0x65, 0x52, 0x12, 0x69, 0x73, 0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x45, 0x6e,
-	0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x05, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18,
-	0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x22, 0x66, 0x0a, 0x1d, 0x47, 0x65, 0x74,
-	0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72,
-	0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x12, 0x70, 0x69,
-	0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x73,
-	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e,
-	0x45, 0x64, 0x67, 0x65, 0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x12, 0x70,
+	0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x3f, 0x0a,
+	0x11, 0x47, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x12, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x42, 0x75, 0x66, 0x66,
+	0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x36,
+	0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x69,
+	0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x69,
+	0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x4b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x50, 0x69, 0x70,
+	0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x50, 0x69, 0x70,
+	0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x22, 0x4d, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78,
+	0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a,
+	0x0a, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x65,
+	0x72, 0x74, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x65, 0x72, 0x74,
+	0x65, 0x78, 0x22, 0x57, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d,
+	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b,
+	0x0a, 0x0d, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18,
+	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x56,
+	0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0d, 0x76, 0x65,
+	0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xec, 0x01, 0x0a, 0x0d,
+	0x45, 0x64, 0x67, 0x65, 0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x1a, 0x0a,
+	0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x64, 0x67,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x64, 0x67, 0x65, 0x12, 0x3b, 0x0a,
+	0x0a, 0x77, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a,
+	0x77, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x4a, 0x0a, 0x12, 0x69, 0x73,
+	0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c,
+	0x75, 0x65, 0x52, 0x12, 0x69, 0x73, 0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x45,
+	0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x05,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f,
+	0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x22, 0x66, 0x0a, 0x1d, 0x47, 0x65,
+	0x74, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61,
+	0x72, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x12, 0x70,
 	0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b,
-	0x73, 0x22, 0x3a, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65,
-	0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x32, 0xb6, 0x05,
-	0x0a, 0x0d, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,
-	0x74, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x12, 0x1a,
-	0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x66, 0x66,
-	0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x64, 0x61, 0x65,
-	0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12,
-	0x24, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e,
-	0x65, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x2f, 0x62, 0x75,
-	0x66, 0x66, 0x65, 0x72, 0x73, 0x12, 0x77, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66,
-	0x65, 0x72, 0x12, 0x18, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x42,
-	0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x64,
-	0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12,
-	0x2d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e,
-	0x65, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x2f, 0x62, 0x75,
-	0x66, 0x66, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x7d, 0x12, 0x95,
-	0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72,
-	0x69, 0x63, 0x73, 0x12, 0x1f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74,
-	0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65,
-	0x74, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x12, 0x36,
+	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e,
+	0x2e, 0x45, 0x64, 0x67, 0x65, 0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x12,
+	0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72,
+	0x6b, 0x73, 0x22, 0x3a, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e,
+	0x65, 0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x4c,
+	0x0a, 0x16, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72,
+	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x69, 0x70, 0x65,
+	0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x69, 0x70, 0x65,
+	0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0xb0, 0x01, 0x0a,
+	0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12,
+	0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x38, 0x0a,
+	0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73,
+	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22,
+	0x6b, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73,
+	0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x40, 0x0a, 0x0f, 0x63, 0x6f,
+	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e,
+	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x0f, 0x63, 0x6f, 0x6e,
+	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x48, 0x0a, 0x17,
+	0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72,
+	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e,
+	0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52, 0x06,
+	0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x32, 0xca, 0x06, 0x0a, 0x0d, 0x44, 0x61, 0x65, 0x6d, 0x6f,
+	0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x74, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74,
+	0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x12, 0x1a, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e,
+	0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x73,
+	0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76,
+	0x31, 0x2f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x70,
+	0x65, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x2f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x12, 0x77,
+	0x0a, 0x09, 0x47, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x64, 0x61,
+	0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47,
+	0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76,
+	0x31, 0x2f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x70,
+	0x65, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x2f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x2f, 0x7b,
+	0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x7d, 0x12, 0x95, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x56,
+	0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x1f, 0x2e, 0x64,
+	0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d,
+	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e,
+	0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78,
+	0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x12, 0x36, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31,
+	0x2f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x70, 0x65,
+	0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b,
+	0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12,
+	0x95, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x57,
+	0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x65, 0x6d,
+	0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x61,
+	0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x25, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x69, 0x70, 0x65,
+	0x6c, 0x69, 0x6e, 0x65, 0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27,
 	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65,
-	0x73, 0x2f, 0x7b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x2f, 0x76, 0x65, 0x72,
-	0x74, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x7d, 0x2f, 0x6d,
-	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x95, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, 0x69,
-	0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x73,
-	0x12, 0x24, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x69, 0x70,
-	0x65, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e,
-	0x47, 0x65, 0x74, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x61, 0x74, 0x65, 0x72,
-	0x6d, 0x61, 0x72, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82,
-	0xd3, 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70,
-	0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69,
-	0x6e, 0x65, 0x7d, 0x2f, 0x77, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x85,
-	0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74,
-	0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65,
-	0x74, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e,
-	0x47, 0x65, 0x74, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02,
-	0x25, 0x12, 0x23, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x69, 0x70, 0x65, 0x6c,
-	0x69, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x2f,
-	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
-	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x75, 0x6d, 0x61, 0x70, 0x72, 0x6f, 0x6a, 0x2f, 0x6e, 0x75,
-	0x6d, 0x61, 0x66, 0x6c, 0x6f, 0x77, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x33,
+	0x73, 0x2f, 0x7b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x2f, 0x77, 0x61, 0x74,
+	0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50,
+	0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e,
+	0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69,
+	0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x21, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x69, 0x70, 0x65,
+	0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x61, 0x70, 0x69,
+	0x2f, 0x76, 0x31, 0x2f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x70,
+	0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
+	0x91, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x45, 0x72, 0x72,
+	0x6f, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74,
+	0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74,
+	0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x61,
+	0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2f,
+	0x7b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x74, 0x69,
+	0x63, 0x65, 0x73, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x7d, 0x2f, 0x65, 0x72, 0x72,
+	0x6f, 0x72, 0x73, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
+	0x6d, 0x2f, 0x6e, 0x75, 0x6d, 0x61, 0x70, 0x72, 0x6f, 0x6a, 0x2f, 0x6e, 0x75, 0x6d, 0x61, 0x66,
+	0x6c, 0x6f, 0x77, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2f, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x33,
 }
 
 var (
@@ -1062,7 +1342,7 @@ func file_pkg_apis_proto_daemon_daemon_proto_rawDescGZIP() []byte {
 	return file_pkg_apis_proto_daemon_daemon_proto_rawDescData
 }
 
-var file_pkg_apis_proto_daemon_daemon_proto_msgTypes = make([]protoimpl.MessageInfo, 16)
+var file_pkg_apis_proto_daemon_daemon_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
 var file_pkg_apis_proto_daemon_daemon_proto_goTypes = []any{
 	(*BufferInfo)(nil),                    // 0: daemon.BufferInfo
 	(*VertexMetrics)(nil),                 // 1: daemon.VertexMetrics
@@ -1078,46 +1358,56 @@ var file_pkg_apis_proto_daemon_daemon_proto_goTypes = []any{
 	(*EdgeWatermark)(nil),                 // 11: daemon.EdgeWatermark
 	(*GetPipelineWatermarksResponse)(nil), // 12: daemon.GetPipelineWatermarksResponse
 	(*GetPipelineWatermarksRequest)(nil),  // 13: daemon.GetPipelineWatermarksRequest
-	nil,                                   // 14: daemon.VertexMetrics.ProcessingRatesEntry
-	nil,                                   // 15: daemon.VertexMetrics.PendingsEntry
-	(*wrapperspb.Int64Value)(nil),         // 16: google.protobuf.Int64Value
-	(*wrapperspb.DoubleValue)(nil),        // 17: google.protobuf.DoubleValue
-	(*wrapperspb.BoolValue)(nil),          // 18: google.protobuf.BoolValue
+	(*GetVertexErrorsRequest)(nil),        // 14: daemon.GetVertexErrorsRequest
+	(*ContainerError)(nil),                // 15: daemon.ContainerError
+	(*ReplicaErrors)(nil),                 // 16: daemon.ReplicaErrors
+	(*GetVertexErrorsResponse)(nil),       // 17: daemon.GetVertexErrorsResponse
+	nil,                                   // 18: daemon.VertexMetrics.ProcessingRatesEntry
+	nil,                                   // 19: daemon.VertexMetrics.PendingsEntry
+	(*wrapperspb.Int64Value)(nil),         // 20: google.protobuf.Int64Value
+	(*wrapperspb.DoubleValue)(nil),        // 21: google.protobuf.DoubleValue
+	(*wrapperspb.BoolValue)(nil),          // 22: google.protobuf.BoolValue
+	(*timestamppb.Timestamp)(nil),         // 23: google.protobuf.Timestamp
 }
 var file_pkg_apis_proto_daemon_daemon_proto_depIdxs = []int32{
-	16, // 0: daemon.BufferInfo.pendingCount:type_name -> google.protobuf.Int64Value
-	16, // 1: daemon.BufferInfo.ackPendingCount:type_name -> google.protobuf.Int64Value
-	16, // 2: daemon.BufferInfo.totalMessages:type_name -> google.protobuf.Int64Value
-	16, // 3: daemon.BufferInfo.bufferLength:type_name -> google.protobuf.Int64Value
-	17, // 4: daemon.BufferInfo.bufferUsageLimit:type_name -> google.protobuf.DoubleValue
-	17, // 5: daemon.BufferInfo.bufferUsage:type_name -> google.protobuf.DoubleValue
-	18, // 6: daemon.BufferInfo.isFull:type_name -> google.protobuf.BoolValue
-	14, // 7: daemon.VertexMetrics.processingRates:type_name -> daemon.VertexMetrics.ProcessingRatesEntry
-	15, // 8: daemon.VertexMetrics.pendings:type_name -> daemon.VertexMetrics.PendingsEntry
+	20, // 0: daemon.BufferInfo.pendingCount:type_name -> google.protobuf.Int64Value
+	20, // 1: daemon.BufferInfo.ackPendingCount:type_name -> google.protobuf.Int64Value
+	20, // 2: daemon.BufferInfo.totalMessages:type_name -> google.protobuf.Int64Value
+	20, // 3: daemon.BufferInfo.bufferLength:type_name -> google.protobuf.Int64Value
+	21, // 4: daemon.BufferInfo.bufferUsageLimit:type_name -> google.protobuf.DoubleValue
+	21, // 5: daemon.BufferInfo.bufferUsage:type_name -> google.protobuf.DoubleValue
+	22, // 6: daemon.BufferInfo.isFull:type_name -> google.protobuf.BoolValue
+	18, // 7: daemon.VertexMetrics.processingRates:type_name -> daemon.VertexMetrics.ProcessingRatesEntry
+	19, // 8: daemon.VertexMetrics.pendings:type_name -> daemon.VertexMetrics.PendingsEntry
 	0,  // 9: daemon.ListBuffersResponse.buffers:type_name -> daemon.BufferInfo
 	0,  // 10: daemon.GetBufferResponse.buffer:type_name -> daemon.BufferInfo
 	2,  // 11: daemon.GetPipelineStatusResponse.status:type_name -> daemon.PipelineStatus
 	1,  // 12: daemon.GetVertexMetricsResponse.vertexMetrics:type_name -> daemon.VertexMetrics
-	16, // 13: daemon.EdgeWatermark.watermarks:type_name -> google.protobuf.Int64Value
-	18, // 14: daemon.EdgeWatermark.isWatermarkEnabled:type_name -> google.protobuf.BoolValue
+	20, // 13: daemon.EdgeWatermark.watermarks:type_name -> google.protobuf.Int64Value
+	22, // 14: daemon.EdgeWatermark.isWatermarkEnabled:type_name -> google.protobuf.BoolValue
 	11, // 15: daemon.GetPipelineWatermarksResponse.pipelineWatermarks:type_name -> daemon.EdgeWatermark
-	17, // 16: daemon.VertexMetrics.ProcessingRatesEntry.value:type_name -> google.protobuf.DoubleValue
-	16, // 17: daemon.VertexMetrics.PendingsEntry.value:type_name -> google.protobuf.Int64Value
-	3,  // 18: daemon.DaemonService.ListBuffers:input_type -> daemon.ListBuffersRequest
-	5,  // 19: daemon.DaemonService.GetBuffer:input_type -> daemon.GetBufferRequest
-	9,  // 20: daemon.DaemonService.GetVertexMetrics:input_type -> daemon.GetVertexMetricsRequest
-	13, // 21: daemon.DaemonService.GetPipelineWatermarks:input_type -> daemon.GetPipelineWatermarksRequest
-	7,  // 22: daemon.DaemonService.GetPipelineStatus:input_type -> daemon.GetPipelineStatusRequest
-	4,  // 23: daemon.DaemonService.ListBuffers:output_type -> daemon.ListBuffersResponse
-	6,  // 24: daemon.DaemonService.GetBuffer:output_type -> daemon.GetBufferResponse
-	10, // 25: daemon.DaemonService.GetVertexMetrics:output_type -> daemon.GetVertexMetricsResponse
-	12, // 26: daemon.DaemonService.GetPipelineWatermarks:output_type -> daemon.GetPipelineWatermarksResponse
-	8,  // 27: daemon.DaemonService.GetPipelineStatus:output_type -> daemon.GetPipelineStatusResponse
-	23, // [23:28] is the sub-list for method output_type
-	18, // [18:23] is the sub-list for method input_type
-	18, // [18:18] is the sub-list for extension type_name
-	18, // [18:18] is the sub-list for extension extendee
-	0,  // [0:18] is the sub-list for field type_name
+	23, // 16: daemon.ContainerError.timestamp:type_name -> google.protobuf.Timestamp
+	15, // 17: daemon.ReplicaErrors.containerErrors:type_name -> daemon.ContainerError
+	16, // 18: daemon.GetVertexErrorsResponse.errors:type_name -> daemon.ReplicaErrors
+	21, // 19: daemon.VertexMetrics.ProcessingRatesEntry.value:type_name -> google.protobuf.DoubleValue
+	20, // 20: daemon.VertexMetrics.PendingsEntry.value:type_name -> google.protobuf.Int64Value
+	3,  // 21: daemon.DaemonService.ListBuffers:input_type -> daemon.ListBuffersRequest
+	5,  // 22: daemon.DaemonService.GetBuffer:input_type -> daemon.GetBufferRequest
+	9,  // 23: daemon.DaemonService.GetVertexMetrics:input_type -> daemon.GetVertexMetricsRequest
+	13, // 24: daemon.DaemonService.GetPipelineWatermarks:input_type -> daemon.GetPipelineWatermarksRequest
+	7,  // 25: daemon.DaemonService.GetPipelineStatus:input_type -> daemon.GetPipelineStatusRequest
+	14, // 26: daemon.DaemonService.GetVertexErrors:input_type -> daemon.GetVertexErrorsRequest
+	4,  // 27: daemon.DaemonService.ListBuffers:output_type -> daemon.ListBuffersResponse
+	6,  // 28: daemon.DaemonService.GetBuffer:output_type -> daemon.GetBufferResponse
+	10, // 29: daemon.DaemonService.GetVertexMetrics:output_type -> daemon.GetVertexMetricsResponse
+	12, // 30: daemon.DaemonService.GetPipelineWatermarks:output_type -> daemon.GetPipelineWatermarksResponse
+	8,  // 31: daemon.DaemonService.GetPipelineStatus:output_type -> daemon.GetPipelineStatusResponse
+	17, // 32: daemon.DaemonService.GetVertexErrors:output_type -> daemon.GetVertexErrorsResponse
+	27, // [27:33] is the sub-list for method output_type
+	21, // [21:27] is the sub-list for method input_type
+	21, // [21:21] is the sub-list for extension type_name
+	21, // [21:21] is the sub-list for extension extendee
+	0,  // [0:21] is the sub-list for field type_name
 }
 
 func init() { file_pkg_apis_proto_daemon_daemon_proto_init() }
@@ -1294,6 +1584,54 @@ func file_pkg_apis_proto_daemon_daemon_proto_init() {
 				return nil
 			}
 		}
+		file_pkg_apis_proto_daemon_daemon_proto_msgTypes[14].Exporter = func(v any, i int) any {
+			switch v := v.(*GetVertexErrorsRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_pkg_apis_proto_daemon_daemon_proto_msgTypes[15].Exporter = func(v any, i int) any {
+			switch v := v.(*ContainerError); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_pkg_apis_proto_daemon_daemon_proto_msgTypes[16].Exporter = func(v any, i int) any {
+			switch v := v.(*ReplicaErrors); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_pkg_apis_proto_daemon_daemon_proto_msgTypes[17].Exporter = func(v any, i int) any {
+			switch v := v.(*GetVertexErrorsResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -1301,7 +1639,7 @@ func file_pkg_apis_proto_daemon_daemon_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_pkg_apis_proto_daemon_daemon_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   16,
+			NumMessages:   20,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/pkg/apis/proto/daemon/daemon.pb.gw.go b/pkg/apis/proto/daemon/daemon.pb.gw.go
index e9647014..0e0aca37 100644
--- a/pkg/apis/proto/daemon/daemon.pb.gw.go
+++ b/pkg/apis/proto/daemon/daemon.pb.gw.go
@@ -331,6 +331,78 @@ func local_request_DaemonService_GetPipelineStatus_0(ctx context.Context, marsha
 
 }
 
+func request_DaemonService_GetVertexErrors_0(ctx context.Context, marshaler runtime.Marshaler, client DaemonServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetVertexErrorsRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pipeline"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pipeline")
+	}
+
+	protoReq.Pipeline, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pipeline", err)
+	}
+
+	val, ok = pathParams["vertex"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "vertex")
+	}
+
+	protoReq.Vertex, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "vertex", err)
+	}
+
+	msg, err := client.GetVertexErrors(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_DaemonService_GetVertexErrors_0(ctx context.Context, marshaler runtime.Marshaler, server DaemonServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetVertexErrorsRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pipeline"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pipeline")
+	}
+
+	protoReq.Pipeline, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pipeline", err)
+	}
+
+	val, ok = pathParams["vertex"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "vertex")
+	}
+
+	protoReq.Vertex, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "vertex", err)
+	}
+
+	msg, err := server.GetVertexErrors(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
 // RegisterDaemonServiceHandlerServer registers the http handlers for service DaemonService to "mux".
 // UnaryRPC     :call DaemonServiceServer directly.
 // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
@@ -462,6 +534,31 @@ func RegisterDaemonServiceHandlerServer(ctx context.Context, mux *runtime.ServeM
 
 	})
 
+	mux.Handle("GET", pattern_DaemonService_GetVertexErrors_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		var err error
+		var annotatedContext context.Context
+		annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/daemon.DaemonService/GetVertexErrors", runtime.WithHTTPPathPattern("/api/v1/pipelines/{pipeline}/vertices/{vertex}/errors"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_DaemonService_GetVertexErrors_0(annotatedContext, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
+		if err != nil {
+			runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_DaemonService_GetVertexErrors_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
 	return nil
 }
 
@@ -613,6 +710,28 @@ func RegisterDaemonServiceHandlerClient(ctx context.Context, mux *runtime.ServeM
 
 	})
 
+	mux.Handle("GET", pattern_DaemonService_GetVertexErrors_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		var err error
+		var annotatedContext context.Context
+		annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/daemon.DaemonService/GetVertexErrors", runtime.WithHTTPPathPattern("/api/v1/pipelines/{pipeline}/vertices/{vertex}/errors"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_DaemonService_GetVertexErrors_0(annotatedContext, inboundMarshaler, client, req, pathParams)
+		annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
+		if err != nil {
+			runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_DaemonService_GetVertexErrors_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
 	return nil
 }
 
@@ -626,6 +745,8 @@ var (
 	pattern_DaemonService_GetPipelineWatermarks_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "pipelines", "pipeline", "watermarks"}, ""))
 
 	pattern_DaemonService_GetPipelineStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "pipelines", "pipeline", "status"}, ""))
+
+	pattern_DaemonService_GetVertexErrors_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"api", "v1", "pipelines", "pipeline", "vertices", "vertex", "errors"}, ""))
 )
 
 var (
@@ -638,4 +759,6 @@ var (
 	forward_DaemonService_GetPipelineWatermarks_0 = runtime.ForwardResponseMessage
 
 	forward_DaemonService_GetPipelineStatus_0 = runtime.ForwardResponseMessage
+
+	forward_DaemonService_GetVertexErrors_0 = runtime.ForwardResponseMessage
 )
diff --git a/pkg/apis/proto/daemon/daemon.proto b/pkg/apis/proto/daemon/daemon.proto
index a7b3e773..66f1072b 100644
--- a/pkg/apis/proto/daemon/daemon.proto
+++ b/pkg/apis/proto/daemon/daemon.proto
@@ -21,6 +21,7 @@ option go_package = "github.com/numaproj/numaflow/pkg/apis/proto/daemon";
 import "google/api/annotations.proto";
 import "google/protobuf/empty.proto";
 import "google/protobuf/wrappers.proto";
+import "google/protobuf/timestamp.proto";
 
 package daemon;
 
@@ -109,6 +110,32 @@ message GetPipelineWatermarksRequest {
   string pipeline = 1;
 }
 
+// GetVertexErrorsRequest is a request message for retrieving the errors for a vertex.
+message GetVertexErrorsRequest {
+  string pipeline = 1;
+  string vertex = 2;
+}
+
+// ContainerError is used to provide information for a container error
+// including timestamp, error code, message and details
+message ContainerError {
+  string container = 1;
+  google.protobuf.Timestamp timestamp = 2;
+  string code = 3;
+  string message = 4;
+  string details = 5;
+}
+
+// ReplicaErrors is used to provide all the container errors for a replica
+message ReplicaErrors {
+  string replica = 1;
+  repeated ContainerError containerErrors = 2;
+}
+
+message GetVertexErrorsResponse {
+  repeated ReplicaErrors errors = 1;
+}
+
 // DaemonService is a grpc service that is used to provide APIs for giving any pipeline information.
 service DaemonService {
 
@@ -132,4 +159,8 @@ service DaemonService {
   rpc GetPipelineStatus (GetPipelineStatusRequest) returns (GetPipelineStatusResponse) {
     option (google.api.http).get = "/api/v1/pipelines/{pipeline}/status";
   };
+
+  rpc GetVertexErrors (GetVertexErrorsRequest) returns (GetVertexErrorsResponse) {
+    option (google.api.http).get = "/api/v1/pipelines/{pipeline}/vertices/{vertex}/errors";
+  };
 }
\ No newline at end of file
diff --git a/pkg/apis/proto/daemon/daemon_grpc.pb.go b/pkg/apis/proto/daemon/daemon_grpc.pb.go
index 6b348d8f..5f06bcf6 100644
--- a/pkg/apis/proto/daemon/daemon_grpc.pb.go
+++ b/pkg/apis/proto/daemon/daemon_grpc.pb.go
@@ -39,6 +39,7 @@ const (
 	DaemonService_GetVertexMetrics_FullMethodName      = "/daemon.DaemonService/GetVertexMetrics"
 	DaemonService_GetPipelineWatermarks_FullMethodName = "/daemon.DaemonService/GetPipelineWatermarks"
 	DaemonService_GetPipelineStatus_FullMethodName     = "/daemon.DaemonService/GetPipelineStatus"
+	DaemonService_GetVertexErrors_FullMethodName       = "/daemon.DaemonService/GetVertexErrors"
 )
 
 // DaemonServiceClient is the client API for DaemonService service.
@@ -53,6 +54,7 @@ type DaemonServiceClient interface {
 	// GetPipelineWatermarks return the watermark of the given pipeline
 	GetPipelineWatermarks(ctx context.Context, in *GetPipelineWatermarksRequest, opts ...grpc.CallOption) (*GetPipelineWatermarksResponse, error)
 	GetPipelineStatus(ctx context.Context, in *GetPipelineStatusRequest, opts ...grpc.CallOption) (*GetPipelineStatusResponse, error)
+	GetVertexErrors(ctx context.Context, in *GetVertexErrorsRequest, opts ...grpc.CallOption) (*GetVertexErrorsResponse, error)
 }
 
 type daemonServiceClient struct {
@@ -113,6 +115,16 @@ func (c *daemonServiceClient) GetPipelineStatus(ctx context.Context, in *GetPipe
 	return out, nil
 }
 
+func (c *daemonServiceClient) GetVertexErrors(ctx context.Context, in *GetVertexErrorsRequest, opts ...grpc.CallOption) (*GetVertexErrorsResponse, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(GetVertexErrorsResponse)
+	err := c.cc.Invoke(ctx, DaemonService_GetVertexErrors_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // DaemonServiceServer is the server API for DaemonService service.
 // All implementations must embed UnimplementedDaemonServiceServer
 // for forward compatibility
@@ -125,6 +137,7 @@ type DaemonServiceServer interface {
 	// GetPipelineWatermarks return the watermark of the given pipeline
 	GetPipelineWatermarks(context.Context, *GetPipelineWatermarksRequest) (*GetPipelineWatermarksResponse, error)
 	GetPipelineStatus(context.Context, *GetPipelineStatusRequest) (*GetPipelineStatusResponse, error)
+	GetVertexErrors(context.Context, *GetVertexErrorsRequest) (*GetVertexErrorsResponse, error)
 	mustEmbedUnimplementedDaemonServiceServer()
 }
 
@@ -147,6 +160,9 @@ func (UnimplementedDaemonServiceServer) GetPipelineWatermarks(context.Context, *
 func (UnimplementedDaemonServiceServer) GetPipelineStatus(context.Context, *GetPipelineStatusRequest) (*GetPipelineStatusResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method GetPipelineStatus not implemented")
 }
+func (UnimplementedDaemonServiceServer) GetVertexErrors(context.Context, *GetVertexErrorsRequest) (*GetVertexErrorsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetVertexErrors not implemented")
+}
 func (UnimplementedDaemonServiceServer) mustEmbedUnimplementedDaemonServiceServer() {}
 
 // UnsafeDaemonServiceServer may be embedded to opt out of forward compatibility for this service.
@@ -250,6 +266,24 @@ func _DaemonService_GetPipelineStatus_Handler(srv interface{}, ctx context.Conte
 	return interceptor(ctx, in, info, handler)
 }
 
+func _DaemonService_GetVertexErrors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetVertexErrorsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(DaemonServiceServer).GetVertexErrors(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: DaemonService_GetVertexErrors_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(DaemonServiceServer).GetVertexErrors(ctx, req.(*GetVertexErrorsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 // DaemonService_ServiceDesc is the grpc.ServiceDesc for DaemonService service.
 // It's only intended for direct use with grpc.RegisterService,
 // and not to be introspected or modified (even as a copy)
@@ -277,6 +311,10 @@ var DaemonService_ServiceDesc = grpc.ServiceDesc{
 			MethodName: "GetPipelineStatus",
 			Handler:    _DaemonService_GetPipelineStatus_Handler,
 		},
+		{
+			MethodName: "GetVertexErrors",
+			Handler:    _DaemonService_GetVertexErrors_Handler,
+		},
 	},
 	Streams:  []grpc.StreamDesc{},
 	Metadata: "pkg/apis/proto/daemon/daemon.proto",
diff --git a/pkg/apis/proto/mvtxdaemon/mvtxdaemon.pb.go b/pkg/apis/proto/mvtxdaemon/mvtxdaemon.pb.go
index e33c93aa..18936d31 100644
--- a/pkg/apis/proto/mvtxdaemon/mvtxdaemon.pb.go
+++ b/pkg/apis/proto/mvtxdaemon/mvtxdaemon.pb.go
@@ -26,6 +26,7 @@ import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	emptypb "google.golang.org/protobuf/types/known/emptypb"
+	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
 	wrapperspb "google.golang.org/protobuf/types/known/wrapperspb"
 	reflect "reflect"
 	sync "sync"
@@ -262,6 +263,238 @@ func (x *GetMonoVertexStatusResponse) GetStatus() *MonoVertexStatus {
 	return nil
 }
 
+// GetMonoVertexErrorsRequest is a request message for retrieving the errors for a mono vertex.
+type GetMonoVertexErrorsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	MonoVertex string `protobuf:"bytes,1,opt,name=monoVertex,proto3" json:"monoVertex,omitempty"`
+}
+
+func (x *GetMonoVertexErrorsRequest) Reset() {
+	*x = GetMonoVertexErrorsRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetMonoVertexErrorsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetMonoVertexErrorsRequest) ProtoMessage() {}
+
+func (x *GetMonoVertexErrorsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetMonoVertexErrorsRequest.ProtoReflect.Descriptor instead.
+func (*GetMonoVertexErrorsRequest) Descriptor() ([]byte, []int) {
+	return file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *GetMonoVertexErrorsRequest) GetMonoVertex() string {
+	if x != nil {
+		return x.MonoVertex
+	}
+	return ""
+}
+
+// ContainerError is used to provide information for a container error
+// including timestamp, error code, message and details
+type ContainerError struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Container string                 `protobuf:"bytes,1,opt,name=container,proto3" json:"container,omitempty"`
+	Timestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+	Code      string                 `protobuf:"bytes,3,opt,name=code,proto3" json:"code,omitempty"`
+	Message   string                 `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"`
+	Details   string                 `protobuf:"bytes,5,opt,name=details,proto3" json:"details,omitempty"`
+}
+
+func (x *ContainerError) Reset() {
+	*x = ContainerError{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ContainerError) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ContainerError) ProtoMessage() {}
+
+func (x *ContainerError) ProtoReflect() protoreflect.Message {
+	mi := &file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ContainerError.ProtoReflect.Descriptor instead.
+func (*ContainerError) Descriptor() ([]byte, []int) {
+	return file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *ContainerError) GetContainer() string {
+	if x != nil {
+		return x.Container
+	}
+	return ""
+}
+
+func (x *ContainerError) GetTimestamp() *timestamppb.Timestamp {
+	if x != nil {
+		return x.Timestamp
+	}
+	return nil
+}
+
+func (x *ContainerError) GetCode() string {
+	if x != nil {
+		return x.Code
+	}
+	return ""
+}
+
+func (x *ContainerError) GetMessage() string {
+	if x != nil {
+		return x.Message
+	}
+	return ""
+}
+
+func (x *ContainerError) GetDetails() string {
+	if x != nil {
+		return x.Details
+	}
+	return ""
+}
+
+// ReplicaErrors is used to provide all the container errors for a replica
+type ReplicaErrors struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica         string            `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+	ContainerErrors []*ContainerError `protobuf:"bytes,2,rep,name=containerErrors,proto3" json:"containerErrors,omitempty"`
+}
+
+func (x *ReplicaErrors) Reset() {
+	*x = ReplicaErrors{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaErrors) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaErrors) ProtoMessage() {}
+
+func (x *ReplicaErrors) ProtoReflect() protoreflect.Message {
+	mi := &file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaErrors.ProtoReflect.Descriptor instead.
+func (*ReplicaErrors) Descriptor() ([]byte, []int) {
+	return file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *ReplicaErrors) GetReplica() string {
+	if x != nil {
+		return x.Replica
+	}
+	return ""
+}
+
+func (x *ReplicaErrors) GetContainerErrors() []*ContainerError {
+	if x != nil {
+		return x.ContainerErrors
+	}
+	return nil
+}
+
+type GetMonoVertexErrorsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Errors []*ReplicaErrors `protobuf:"bytes,1,rep,name=errors,proto3" json:"errors,omitempty"`
+}
+
+func (x *GetMonoVertexErrorsResponse) Reset() {
+	*x = GetMonoVertexErrorsResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetMonoVertexErrorsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetMonoVertexErrorsResponse) ProtoMessage() {}
+
+func (x *GetMonoVertexErrorsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetMonoVertexErrorsResponse.ProtoReflect.Descriptor instead.
+func (*GetMonoVertexErrorsResponse) Descriptor() ([]byte, []int) {
+	return file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *GetMonoVertexErrorsResponse) GetErrors() []*ReplicaErrors {
+	if x != nil {
+		return x.Errors
+	}
+	return nil
+}
+
 var File_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto protoreflect.FileDescriptor
 
 var file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_rawDesc = []byte{
@@ -274,69 +507,108 @@ var file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_rawDesc = []byte{
 	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72,
 	0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,
 	0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x22, 0x96, 0x03, 0x0a, 0x11, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74,
-	0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x6f, 0x6e,
-	0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d,
-	0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x12, 0x5c, 0x0a, 0x0f, 0x70, 0x72, 0x6f,
-	0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6d, 0x76, 0x74, 0x78, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e,
-	0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63,
-	0x73, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65,
-	0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69,
-	0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x08, 0x70, 0x65, 0x6e, 0x64, 0x69,
-	0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6d, 0x76, 0x74, 0x78,
-	0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65,
-	0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67,
-	0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73,
-	0x1a, 0x60, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x61,
-	0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x32, 0x0a, 0x05, 0x76, 0x61,
-	0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
-	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62,
-	0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
-	0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0d, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e,
-	0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75,
-	0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x57, 0x0a, 0x1c,
-	0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74,
-	0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x07,
-	0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e,
-	0x6d, 0x76, 0x74, 0x78, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x6f, 0x6e, 0x6f, 0x56,
-	0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x07, 0x6d, 0x65,
-	0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x58, 0x0a, 0x10, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72,
-	0x74, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61,
-	0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63,
-	0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22,
-	0x53, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78,
-	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34,
-	0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c,
+	0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x22, 0x96, 0x03, 0x0a, 0x11, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72,
+	0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x6f,
+	0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,
+	0x6d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x12, 0x5c, 0x0a, 0x0f, 0x70, 0x72,
+	0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6d, 0x76, 0x74, 0x78, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e,
+	0x2e, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69,
+	0x63, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74,
+	0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,
+	0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x08, 0x70, 0x65, 0x6e, 0x64,
+	0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6d, 0x76, 0x74,
+	0x78, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74,
+	0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e,
+	0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67,
+	0x73, 0x1a, 0x60, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x52,
+	0x61, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x32, 0x0a, 0x05, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75,
+	0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a,
+	0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0d, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x45,
+	0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c,
+	0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x57, 0x0a,
+	0x1c, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65,
+	0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a,
+	0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d,
 	0x2e, 0x6d, 0x76, 0x74, 0x78, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x6f, 0x6e, 0x6f,
-	0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74,
-	0x61, 0x74, 0x75, 0x73, 0x32, 0xfc, 0x01, 0x0a, 0x17, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72,
-	0x74, 0x65, 0x78, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x12, 0x71, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65,
-	0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
-	0x1a, 0x28, 0x2e, 0x6d, 0x76, 0x74, 0x78, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65,
-	0x74, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69,
-	0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93,
-	0x02, 0x11, 0x12, 0x0f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x72,
-	0x69, 0x63, 0x73, 0x12, 0x6e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65,
-	0x72, 0x74, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f,
-	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70,
-	0x74, 0x79, 0x1a, 0x27, 0x2e, 0x6d, 0x76, 0x74, 0x78, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e,
-	0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x53, 0x74, 0x61,
-	0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4,
-	0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61,
-	0x74, 0x75, 0x73, 0x42, 0x38, 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
-	0x6d, 0x2f, 0x6e, 0x75, 0x6d, 0x61, 0x70, 0x72, 0x6f, 0x6a, 0x2f, 0x6e, 0x75, 0x6d, 0x61, 0x66,
-	0x6c, 0x6f, 0x77, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x2f, 0x6d, 0x76, 0x74, 0x78, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x07, 0x6d,
+	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x58, 0x0a, 0x10, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65,
+	0x72, 0x74, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04,
+	0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65,
+	0x22, 0x53, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65,
+	0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1c, 0x2e, 0x6d, 0x76, 0x74, 0x78, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x6f, 0x6e,
+	0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3c, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x6f,
+	0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65,
+	0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72,
+	0x74, 0x65, 0x78, 0x22, 0xb0, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
+	0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+	0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61,
+	0x69, 0x6e, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x12,
+	0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f,
+	0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07,
+	0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64,
+	0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x6f, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63,
+	0x61, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63,
+	0x61, 0x12, 0x44, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x72,
+	0x72, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x76, 0x74,
+	0x78, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
+	0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
+	0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x50, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4d, 0x6f,
+	0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x76, 0x74, 0x78, 0x64, 0x61, 0x65,
+	0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x45, 0x72, 0x72, 0x6f, 0x72,
+	0x73, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x32, 0x98, 0x03, 0x0a, 0x17, 0x4d, 0x6f,
+	0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x71, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x6f,
+	0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x28, 0x2e, 0x6d, 0x76, 0x74, 0x78, 0x64, 0x61, 0x65, 0x6d,
+	0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78,
+	0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31,
+	0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x6e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4d,
+	0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
+	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x27, 0x2e, 0x6d, 0x76, 0x74, 0x78, 0x64, 0x61,
+	0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74,
+	0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76,
+	0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74,
+	0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73,
+	0x12, 0x26, 0x2e, 0x6d, 0x76, 0x74, 0x78, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65,
+	0x74, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72,
+	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x76, 0x74, 0x78, 0x64,
+	0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72,
+	0x74, 0x65, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x61, 0x70, 0x69, 0x2f,
+	0x76, 0x31, 0x2f, 0x6d, 0x6f, 0x6e, 0x6f, 0x2d, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x65, 0x73,
+	0x2f, 0x7b, 0x6d, 0x6f, 0x6e, 0x6f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x7d, 0x2f, 0x65, 0x72,
+	0x72, 0x6f, 0x72, 0x73, 0x42, 0x38, 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
+	0x6f, 0x6d, 0x2f, 0x6e, 0x75, 0x6d, 0x61, 0x70, 0x72, 0x6f, 0x6a, 0x2f, 0x6e, 0x75, 0x6d, 0x61,
+	0x66, 0x6c, 0x6f, 0x77, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2f, 0x6d, 0x76, 0x74, 0x78, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -351,34 +623,44 @@ func file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_rawDescGZIP() []byte {
 	return file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_rawDescData
 }
 
-var file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
+var file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
 var file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_goTypes = []any{
 	(*MonoVertexMetrics)(nil),            // 0: mvtxdaemon.MonoVertexMetrics
 	(*GetMonoVertexMetricsResponse)(nil), // 1: mvtxdaemon.GetMonoVertexMetricsResponse
 	(*MonoVertexStatus)(nil),             // 2: mvtxdaemon.MonoVertexStatus
 	(*GetMonoVertexStatusResponse)(nil),  // 3: mvtxdaemon.GetMonoVertexStatusResponse
-	nil,                                  // 4: mvtxdaemon.MonoVertexMetrics.ProcessingRatesEntry
-	nil,                                  // 5: mvtxdaemon.MonoVertexMetrics.PendingsEntry
-	(*wrapperspb.DoubleValue)(nil),       // 6: google.protobuf.DoubleValue
-	(*wrapperspb.Int64Value)(nil),        // 7: google.protobuf.Int64Value
-	(*emptypb.Empty)(nil),                // 8: google.protobuf.Empty
+	(*GetMonoVertexErrorsRequest)(nil),   // 4: mvtxdaemon.GetMonoVertexErrorsRequest
+	(*ContainerError)(nil),               // 5: mvtxdaemon.ContainerError
+	(*ReplicaErrors)(nil),                // 6: mvtxdaemon.ReplicaErrors
+	(*GetMonoVertexErrorsResponse)(nil),  // 7: mvtxdaemon.GetMonoVertexErrorsResponse
+	nil,                                  // 8: mvtxdaemon.MonoVertexMetrics.ProcessingRatesEntry
+	nil,                                  // 9: mvtxdaemon.MonoVertexMetrics.PendingsEntry
+	(*timestamppb.Timestamp)(nil),        // 10: google.protobuf.Timestamp
+	(*wrapperspb.DoubleValue)(nil),       // 11: google.protobuf.DoubleValue
+	(*wrapperspb.Int64Value)(nil),        // 12: google.protobuf.Int64Value
+	(*emptypb.Empty)(nil),                // 13: google.protobuf.Empty
 }
 var file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_depIdxs = []int32{
-	4, // 0: mvtxdaemon.MonoVertexMetrics.processingRates:type_name -> mvtxdaemon.MonoVertexMetrics.ProcessingRatesEntry
-	5, // 1: mvtxdaemon.MonoVertexMetrics.pendings:type_name -> mvtxdaemon.MonoVertexMetrics.PendingsEntry
-	0, // 2: mvtxdaemon.GetMonoVertexMetricsResponse.metrics:type_name -> mvtxdaemon.MonoVertexMetrics
-	2, // 3: mvtxdaemon.GetMonoVertexStatusResponse.status:type_name -> mvtxdaemon.MonoVertexStatus
-	6, // 4: mvtxdaemon.MonoVertexMetrics.ProcessingRatesEntry.value:type_name -> google.protobuf.DoubleValue
-	7, // 5: mvtxdaemon.MonoVertexMetrics.PendingsEntry.value:type_name -> google.protobuf.Int64Value
-	8, // 6: mvtxdaemon.MonoVertexDaemonService.GetMonoVertexMetrics:input_type -> google.protobuf.Empty
-	8, // 7: mvtxdaemon.MonoVertexDaemonService.GetMonoVertexStatus:input_type -> google.protobuf.Empty
-	1, // 8: mvtxdaemon.MonoVertexDaemonService.GetMonoVertexMetrics:output_type -> mvtxdaemon.GetMonoVertexMetricsResponse
-	3, // 9: mvtxdaemon.MonoVertexDaemonService.GetMonoVertexStatus:output_type -> mvtxdaemon.GetMonoVertexStatusResponse
-	8, // [8:10] is the sub-list for method output_type
-	6, // [6:8] is the sub-list for method input_type
-	6, // [6:6] is the sub-list for extension type_name
-	6, // [6:6] is the sub-list for extension extendee
-	0, // [0:6] is the sub-list for field type_name
+	8,  // 0: mvtxdaemon.MonoVertexMetrics.processingRates:type_name -> mvtxdaemon.MonoVertexMetrics.ProcessingRatesEntry
+	9,  // 1: mvtxdaemon.MonoVertexMetrics.pendings:type_name -> mvtxdaemon.MonoVertexMetrics.PendingsEntry
+	0,  // 2: mvtxdaemon.GetMonoVertexMetricsResponse.metrics:type_name -> mvtxdaemon.MonoVertexMetrics
+	2,  // 3: mvtxdaemon.GetMonoVertexStatusResponse.status:type_name -> mvtxdaemon.MonoVertexStatus
+	10, // 4: mvtxdaemon.ContainerError.timestamp:type_name -> google.protobuf.Timestamp
+	5,  // 5: mvtxdaemon.ReplicaErrors.containerErrors:type_name -> mvtxdaemon.ContainerError
+	6,  // 6: mvtxdaemon.GetMonoVertexErrorsResponse.errors:type_name -> mvtxdaemon.ReplicaErrors
+	11, // 7: mvtxdaemon.MonoVertexMetrics.ProcessingRatesEntry.value:type_name -> google.protobuf.DoubleValue
+	12, // 8: mvtxdaemon.MonoVertexMetrics.PendingsEntry.value:type_name -> google.protobuf.Int64Value
+	13, // 9: mvtxdaemon.MonoVertexDaemonService.GetMonoVertexMetrics:input_type -> google.protobuf.Empty
+	13, // 10: mvtxdaemon.MonoVertexDaemonService.GetMonoVertexStatus:input_type -> google.protobuf.Empty
+	4,  // 11: mvtxdaemon.MonoVertexDaemonService.GetMonoVertexErrors:input_type -> mvtxdaemon.GetMonoVertexErrorsRequest
+	1,  // 12: mvtxdaemon.MonoVertexDaemonService.GetMonoVertexMetrics:output_type -> mvtxdaemon.GetMonoVertexMetricsResponse
+	3,  // 13: mvtxdaemon.MonoVertexDaemonService.GetMonoVertexStatus:output_type -> mvtxdaemon.GetMonoVertexStatusResponse
+	7,  // 14: mvtxdaemon.MonoVertexDaemonService.GetMonoVertexErrors:output_type -> mvtxdaemon.GetMonoVertexErrorsResponse
+	12, // [12:15] is the sub-list for method output_type
+	9,  // [9:12] is the sub-list for method input_type
+	9,  // [9:9] is the sub-list for extension type_name
+	9,  // [9:9] is the sub-list for extension extendee
+	0,  // [0:9] is the sub-list for field type_name
 }
 
 func init() { file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_init() }
@@ -435,6 +717,54 @@ func file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_init() {
 				return nil
 			}
 		}
+		file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_msgTypes[4].Exporter = func(v any, i int) any {
+			switch v := v.(*GetMonoVertexErrorsRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_msgTypes[5].Exporter = func(v any, i int) any {
+			switch v := v.(*ContainerError); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_msgTypes[6].Exporter = func(v any, i int) any {
+			switch v := v.(*ReplicaErrors); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_msgTypes[7].Exporter = func(v any, i int) any {
+			switch v := v.(*GetMonoVertexErrorsResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -442,7 +772,7 @@ func file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_pkg_apis_proto_mvtxdaemon_mvtxdaemon_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   6,
+			NumMessages:   10,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/pkg/apis/proto/mvtxdaemon/mvtxdaemon.pb.gw.go b/pkg/apis/proto/mvtxdaemon/mvtxdaemon.pb.gw.go
index 53badc43..9fa1c0ba 100644
--- a/pkg/apis/proto/mvtxdaemon/mvtxdaemon.pb.gw.go
+++ b/pkg/apis/proto/mvtxdaemon/mvtxdaemon.pb.gw.go
@@ -68,6 +68,58 @@ func local_request_MonoVertexDaemonService_GetMonoVertexStatus_0(ctx context.Con
 
 }
 
+func request_MonoVertexDaemonService_GetMonoVertexErrors_0(ctx context.Context, marshaler runtime.Marshaler, client MonoVertexDaemonServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetMonoVertexErrorsRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["monoVertex"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "monoVertex")
+	}
+
+	protoReq.MonoVertex, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "monoVertex", err)
+	}
+
+	msg, err := client.GetMonoVertexErrors(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_MonoVertexDaemonService_GetMonoVertexErrors_0(ctx context.Context, marshaler runtime.Marshaler, server MonoVertexDaemonServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetMonoVertexErrorsRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["monoVertex"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "monoVertex")
+	}
+
+	protoReq.MonoVertex, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "monoVertex", err)
+	}
+
+	msg, err := server.GetMonoVertexErrors(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
 // RegisterMonoVertexDaemonServiceHandlerServer registers the http handlers for service MonoVertexDaemonService to "mux".
 // UnaryRPC     :call MonoVertexDaemonServiceServer directly.
 // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
@@ -124,6 +176,31 @@ func RegisterMonoVertexDaemonServiceHandlerServer(ctx context.Context, mux *runt
 
 	})
 
+	mux.Handle("GET", pattern_MonoVertexDaemonService_GetMonoVertexErrors_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		var err error
+		var annotatedContext context.Context
+		annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/mvtxdaemon.MonoVertexDaemonService/GetMonoVertexErrors", runtime.WithHTTPPathPattern("/api/v1/mono-vertices/{monoVertex}/errors"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_MonoVertexDaemonService_GetMonoVertexErrors_0(annotatedContext, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
+		if err != nil {
+			runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_MonoVertexDaemonService_GetMonoVertexErrors_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
 	return nil
 }
 
@@ -209,6 +286,28 @@ func RegisterMonoVertexDaemonServiceHandlerClient(ctx context.Context, mux *runt
 
 	})
 
+	mux.Handle("GET", pattern_MonoVertexDaemonService_GetMonoVertexErrors_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		var err error
+		var annotatedContext context.Context
+		annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/mvtxdaemon.MonoVertexDaemonService/GetMonoVertexErrors", runtime.WithHTTPPathPattern("/api/v1/mono-vertices/{monoVertex}/errors"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_MonoVertexDaemonService_GetMonoVertexErrors_0(annotatedContext, inboundMarshaler, client, req, pathParams)
+		annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
+		if err != nil {
+			runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_MonoVertexDaemonService_GetMonoVertexErrors_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
 	return nil
 }
 
@@ -216,10 +315,14 @@ var (
 	pattern_MonoVertexDaemonService_GetMonoVertexMetrics_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "metrics"}, ""))
 
 	pattern_MonoVertexDaemonService_GetMonoVertexStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "status"}, ""))
+
+	pattern_MonoVertexDaemonService_GetMonoVertexErrors_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "mono-vertices", "monoVertex", "errors"}, ""))
 )
 
 var (
 	forward_MonoVertexDaemonService_GetMonoVertexMetrics_0 = runtime.ForwardResponseMessage
 
 	forward_MonoVertexDaemonService_GetMonoVertexStatus_0 = runtime.ForwardResponseMessage
+
+	forward_MonoVertexDaemonService_GetMonoVertexErrors_0 = runtime.ForwardResponseMessage
 )
diff --git a/pkg/apis/proto/mvtxdaemon/mvtxdaemon.proto b/pkg/apis/proto/mvtxdaemon/mvtxdaemon.proto
index 21bc215c..f32f1b2d 100644
--- a/pkg/apis/proto/mvtxdaemon/mvtxdaemon.proto
+++ b/pkg/apis/proto/mvtxdaemon/mvtxdaemon.proto
@@ -21,6 +21,7 @@ option go_package = "github.com/numaproj/numaflow/pkg/apis/proto/mvtxdaemon";
 import "google/api/annotations.proto";
 import "google/protobuf/empty.proto";
 import "google/protobuf/wrappers.proto";
+import "google/protobuf/timestamp.proto";
 
 package mvtxdaemon;
 
@@ -48,6 +49,31 @@ message GetMonoVertexStatusResponse {
   MonoVertexStatus status = 1;
 }
 
+// GetMonoVertexErrorsRequest is a request message for retrieving the errors for a mono vertex.
+message GetMonoVertexErrorsRequest {
+  string monoVertex = 1;
+}
+
+// ContainerError is used to provide information for a container error
+// including timestamp, error code, message and details
+message ContainerError {
+  string container = 1;
+  google.protobuf.Timestamp timestamp = 2;
+  string code = 3;
+  string message = 4;
+  string details = 5;
+}
+
+// ReplicaErrors is used to provide all the container errors for a replica
+message ReplicaErrors {
+  string replica = 1;
+  repeated ContainerError containerErrors = 2;
+}
+
+message GetMonoVertexErrorsResponse {
+  repeated ReplicaErrors errors = 1;
+}
+
 // MonoVertexDaemonService is a grpc service that is used to provide APIs for giving any MonoVertex information.
 service MonoVertexDaemonService {
 
@@ -59,4 +85,7 @@ service MonoVertexDaemonService {
     option (google.api.http).get = "/api/v1/status";
   };
 
+  rpc GetMonoVertexErrors (GetMonoVertexErrorsRequest) returns (GetMonoVertexErrorsResponse) {
+    option (google.api.http).get = "/api/v1/mono-vertices/{monoVertex}/errors";
+  };
 }
\ No newline at end of file
diff --git a/pkg/apis/proto/mvtxdaemon/mvtxdaemon_grpc.pb.go b/pkg/apis/proto/mvtxdaemon/mvtxdaemon_grpc.pb.go
index 76477c3d..f4ccdd9e 100644
--- a/pkg/apis/proto/mvtxdaemon/mvtxdaemon_grpc.pb.go
+++ b/pkg/apis/proto/mvtxdaemon/mvtxdaemon_grpc.pb.go
@@ -37,6 +37,7 @@ const _ = grpc.SupportPackageIsVersion8
 const (
 	MonoVertexDaemonService_GetMonoVertexMetrics_FullMethodName = "/mvtxdaemon.MonoVertexDaemonService/GetMonoVertexMetrics"
 	MonoVertexDaemonService_GetMonoVertexStatus_FullMethodName  = "/mvtxdaemon.MonoVertexDaemonService/GetMonoVertexStatus"
+	MonoVertexDaemonService_GetMonoVertexErrors_FullMethodName  = "/mvtxdaemon.MonoVertexDaemonService/GetMonoVertexErrors"
 )
 
 // MonoVertexDaemonServiceClient is the client API for MonoVertexDaemonService service.
@@ -47,6 +48,7 @@ const (
 type MonoVertexDaemonServiceClient interface {
 	GetMonoVertexMetrics(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetMonoVertexMetricsResponse, error)
 	GetMonoVertexStatus(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetMonoVertexStatusResponse, error)
+	GetMonoVertexErrors(ctx context.Context, in *GetMonoVertexErrorsRequest, opts ...grpc.CallOption) (*GetMonoVertexErrorsResponse, error)
 }
 
 type monoVertexDaemonServiceClient struct {
@@ -77,6 +79,16 @@ func (c *monoVertexDaemonServiceClient) GetMonoVertexStatus(ctx context.Context,
 	return out, nil
 }
 
+func (c *monoVertexDaemonServiceClient) GetMonoVertexErrors(ctx context.Context, in *GetMonoVertexErrorsRequest, opts ...grpc.CallOption) (*GetMonoVertexErrorsResponse, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(GetMonoVertexErrorsResponse)
+	err := c.cc.Invoke(ctx, MonoVertexDaemonService_GetMonoVertexErrors_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // MonoVertexDaemonServiceServer is the server API for MonoVertexDaemonService service.
 // All implementations must embed UnimplementedMonoVertexDaemonServiceServer
 // for forward compatibility
@@ -85,6 +97,7 @@ func (c *monoVertexDaemonServiceClient) GetMonoVertexStatus(ctx context.Context,
 type MonoVertexDaemonServiceServer interface {
 	GetMonoVertexMetrics(context.Context, *emptypb.Empty) (*GetMonoVertexMetricsResponse, error)
 	GetMonoVertexStatus(context.Context, *emptypb.Empty) (*GetMonoVertexStatusResponse, error)
+	GetMonoVertexErrors(context.Context, *GetMonoVertexErrorsRequest) (*GetMonoVertexErrorsResponse, error)
 	mustEmbedUnimplementedMonoVertexDaemonServiceServer()
 }
 
@@ -98,6 +111,9 @@ func (UnimplementedMonoVertexDaemonServiceServer) GetMonoVertexMetrics(context.C
 func (UnimplementedMonoVertexDaemonServiceServer) GetMonoVertexStatus(context.Context, *emptypb.Empty) (*GetMonoVertexStatusResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method GetMonoVertexStatus not implemented")
 }
+func (UnimplementedMonoVertexDaemonServiceServer) GetMonoVertexErrors(context.Context, *GetMonoVertexErrorsRequest) (*GetMonoVertexErrorsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetMonoVertexErrors not implemented")
+}
 func (UnimplementedMonoVertexDaemonServiceServer) mustEmbedUnimplementedMonoVertexDaemonServiceServer() {
 }
 
@@ -148,6 +164,24 @@ func _MonoVertexDaemonService_GetMonoVertexStatus_Handler(srv interface{}, ctx c
 	return interceptor(ctx, in, info, handler)
 }
 
+func _MonoVertexDaemonService_GetMonoVertexErrors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetMonoVertexErrorsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MonoVertexDaemonServiceServer).GetMonoVertexErrors(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: MonoVertexDaemonService_GetMonoVertexErrors_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MonoVertexDaemonServiceServer).GetMonoVertexErrors(ctx, req.(*GetMonoVertexErrorsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 // MonoVertexDaemonService_ServiceDesc is the grpc.ServiceDesc for MonoVertexDaemonService service.
 // It's only intended for direct use with grpc.RegisterService,
 // and not to be introspected or modified (even as a copy)
@@ -163,6 +197,10 @@ var MonoVertexDaemonService_ServiceDesc = grpc.ServiceDesc{
 			MethodName: "GetMonoVertexStatus",
 			Handler:    _MonoVertexDaemonService_GetMonoVertexStatus_Handler,
 		},
+		{
+			MethodName: "GetMonoVertexErrors",
+			Handler:    _MonoVertexDaemonService_GetMonoVertexErrors_Handler,
+		},
 	},
 	Streams:  []grpc.StreamDesc{},
 	Metadata: "pkg/apis/proto/mvtxdaemon/mvtxdaemon.proto",
diff --git a/pkg/daemon/client/grpc_daemon_client.go b/pkg/daemon/client/grpc_daemon_client.go
index 6b1d0040..006eec56 100644
--- a/pkg/daemon/client/grpc_daemon_client.go
+++ b/pkg/daemon/client/grpc_daemon_client.go
@@ -120,3 +120,15 @@ func (dc *grpcDaemonClient) GetPipelineStatus(ctx context.Context, pipeline stri
 		return rspn.Status, nil
 	}
 }
+
+// GetVertexErrors returns the []ReplicaErrors response instance for GetVertexErrorsRequest
+func (dc *grpcDaemonClient) GetVertexErrors(ctx context.Context, pipeline, vertex string) ([]*daemon.ReplicaErrors, error) {
+	if rspn, err := dc.client.GetVertexErrors(ctx, &daemon.GetVertexErrorsRequest{
+		Pipeline: pipeline,
+		Vertex:   vertex,
+	}); err != nil {
+		return nil, err
+	} else {
+		return rspn.Errors, nil
+	}
+}
diff --git a/pkg/daemon/client/interface.go b/pkg/daemon/client/interface.go
index f3a503f5..9610f2c7 100644
--- a/pkg/daemon/client/interface.go
+++ b/pkg/daemon/client/interface.go
@@ -31,4 +31,5 @@ type DaemonClient interface {
 	GetVertexMetrics(ctx context.Context, pipeline, vertex string) ([]*daemon.VertexMetrics, error)
 	GetPipelineWatermarks(ctx context.Context, pipeline string) ([]*daemon.EdgeWatermark, error)
 	GetPipelineStatus(ctx context.Context, pipeline string) (*daemon.PipelineStatus, error)
+	GetVertexErrors(ctx context.Context, pipeline, vertex string) ([]*daemon.ReplicaErrors, error)
 }
diff --git a/pkg/daemon/client/restful_daemon_client.go b/pkg/daemon/client/restful_daemon_client.go
index df68808f..788a7fed 100644
--- a/pkg/daemon/client/restful_daemon_client.go
+++ b/pkg/daemon/client/restful_daemon_client.go
@@ -160,3 +160,17 @@ func (rc *restfulDaemonClient) GetPipelineStatus(ctx context.Context, pipeline s
 		return res.Status, nil
 	}
 }
+
+// GetVertexErrors returns the []ReplicaErrors response instance for GetVertexErrorsRequest
+func (rc *restfulDaemonClient) GetVertexErrors(ctx context.Context, pipeline, vertex string) ([]*daemon.ReplicaErrors, error) {
+	resp, err := rc.httpClient.Get(fmt.Sprintf("%s/api/v1/pipelines/%s/vertices/%s/errors", rc.hostURL, pipeline, vertex))
+	if err != nil {
+		return nil, fmt.Errorf("failed to call get vertex errors RESTful API, %w", err)
+	}
+	defer func() { _ = resp.Body.Close() }()
+	if res, err := unmarshalResponse[daemon.GetVertexErrorsResponse](resp); err != nil {
+		return nil, err
+	} else {
+		return res.Errors, nil
+	}
+}
diff --git a/pkg/daemon/server/service/pipeline_metrics_query.go b/pkg/daemon/server/service/pipeline_metrics_query.go
index bf6dbd8c..3c835d7c 100644
--- a/pkg/daemon/server/service/pipeline_metrics_query.go
+++ b/pkg/daemon/server/service/pipeline_metrics_query.go
@@ -26,6 +26,7 @@ import (
 
 	"github.com/prometheus/common/expfmt"
 	"go.uber.org/zap"
+	"google.golang.org/protobuf/types/known/timestamppb"
 	"google.golang.org/protobuf/types/known/wrapperspb"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
@@ -233,6 +234,41 @@ func (ps *PipelineMetadataQuery) GetPipelineStatus(ctx context.Context, req *dae
 	return resp, nil
 }
 
+// GetVertexErrors returns errors for a given vertex by accessing the local cache in the runtime service.
+// The errors are persisted in the local cache by the runtime service.
+// Errors are retrieved for all active replicas for a given vertex.
+// A list of replica errors for a given vertex is returned.
+func (ps *PipelineMetadataQuery) GetVertexErrors(ctx context.Context, req *daemon.GetVertexErrorsRequest) (*daemon.GetVertexErrorsResponse, error) {
+	pipeline, vertex := req.GetPipeline(), req.GetVertex()
+	cacheKey := fmt.Sprintf("%s-%s", pipeline, vertex)
+	resp := new(daemon.GetVertexErrorsResponse)
+	localCache := ps.pipelineRuntimeCache.GetLocalCache()
+
+	// If the errors are present in the local cache, return the errors.
+	if errors, ok := localCache[cacheKey]; ok {
+		replicaErrors := make([]*daemon.ReplicaErrors, len(errors))
+		for i, err := range errors {
+			containerErrors := make([]*daemon.ContainerError, len(err.ContainerErrors))
+			for j, containerError := range err.ContainerErrors {
+				containerErrors[j] = &daemon.ContainerError{
+					Container: containerError.Container,
+					Timestamp: timestamppb.New(time.Unix(containerError.Timestamp, 0)),
+					Code:      containerError.Code,
+					Message:   containerError.Message,
+					Details:   containerError.Details,
+				}
+			}
+			replicaErrors[i] = &daemon.ReplicaErrors{
+				Replica:         err.Replica,
+				ContainerErrors: containerErrors,
+			}
+		}
+		resp.Errors = replicaErrors
+	}
+
+	return resp, nil
+}
+
 func getBufferLimits(pl *v1alpha1.Pipeline, v v1alpha1.AbstractVertex) (bufferLength int64, bufferUsageLimit float64) {
 	plLimits := pl.GetPipelineLimits()
 	bufferLength = int64(*plLimits.BufferMaxLength)
diff --git a/pkg/daemon/server/service/runtime/runtime.go b/pkg/daemon/server/service/runtime/runtime.go
index d7729cd0..729a15d7 100644
--- a/pkg/daemon/server/service/runtime/runtime.go
+++ b/pkg/daemon/server/service/runtime/runtime.go
@@ -38,32 +38,37 @@ const (
 	runtimeErrorsTimeStep = 60 * time.Second
 )
 
+// ErrorDetails is used to provide information for a container error
+// including timestamp, error code, message and details
+type ErrorDetails struct {
+	Container string `json:"container"`
+	Timestamp int64  `json:"timestamp"`
+	Code      string `json:"code"`
+	Message   string `json:"message"`
+	Details   string `json:"details"`
+}
+
+type ErrorApiResponse struct {
+	ErrMessage string         `json:"errorMessage"`
+	Data       []ErrorDetails `json:"data"`
+}
+
+// ReplicaErrors is used to provide all the container errors for a replica
+type ReplicaErrors struct {
+	Replica         string         `json:"replica"`
+	ContainerErrors []ErrorDetails `json:"containerErrors"`
+}
+
 // PipelineRuntimeCache is an interface for caching and retrieving the runtime information.
 type PipelineRuntimeCache interface {
 	// StartCacheRefresher starts the cache refresher to update the local cache with the runtime errors.
 	StartCacheRefresher(ctx context.Context) error
-	// GetLocalCache returns the local cache of runtime errors.
-	GetLocalCache() map[PodReplica][]ErrorDetails
+	// GetLocalCache returns the local cache of runtime errors for each vertex.
+	GetLocalCache() map[string][]ReplicaErrors
 }
 
 var _ PipelineRuntimeCache = (*pipelineRuntimeCache)(nil)
 
-// TODO: use a separate struct instead of concatenating strings
-
-type PodReplica string
-
-type ErrorApiResponse struct {
-	ErrMessage string         `json:"error_message"`
-	Data       []ErrorDetails `json:"data"`
-}
-type ErrorDetails struct {
-	Container string `json:"container"`
-	Timestamp string `json:"timestamp"`
-	Code      string `json:"code"`
-	Message   string `json:"message"`
-	Details   string `json:"details"`
-}
-
 type monitorHttpClient interface {
 	Get(url string) (*http.Response, error)
 	Head(url string) (*http.Response, error)
@@ -73,7 +78,7 @@ type monitorHttpClient interface {
 // It implements the PipelineRuntimeCache interface.
 type pipelineRuntimeCache struct {
 	pipeline   *v1alpha1.Pipeline
-	localCache map[PodReplica][]ErrorDetails
+	localCache map[string][]ReplicaErrors
 	cacheMutex sync.RWMutex
 	podTracker *PodTracker
 	log        *zap.SugaredLogger
@@ -83,7 +88,7 @@ type pipelineRuntimeCache struct {
 func NewRuntime(ctx context.Context, pl *v1alpha1.Pipeline) PipelineRuntimeCache {
 	return &pipelineRuntimeCache{
 		pipeline:   pl,
-		localCache: make(map[PodReplica][]ErrorDetails),
+		localCache: make(map[string][]ReplicaErrors),
 		cacheMutex: sync.RWMutex{},
 		log:        logging.FromContext(ctx).Named("pipelineRuntimeCache"),
 		httpClient: &http.Client{
@@ -182,25 +187,41 @@ func (r *pipelineRuntimeCache) fetchAndPersistErrorForPod(vtxName string, podInd
 		return
 	}
 
-	cacheKey := PodReplica(fmt.Sprintf("%s-%s-%v", r.pipeline.Name, vtxName, podIndex))
+	cacheKey := fmt.Sprintf("%s-%s", r.pipeline.Name, vtxName)
+	replica := fmt.Sprintf("%s-%s-%v", r.pipeline.Name, vtxName, podIndex)
+	newVtxErrors := ReplicaErrors{Replica: replica, ContainerErrors: apiResponse.Data}
 
+	r.log.Debugf("Persisting error in local cache for: %s", cacheKey)
 	// Lock the cache before updating
 	r.cacheMutex.Lock()
 	defer r.cacheMutex.Unlock()
 
 	// overwrite the errors
-	r.localCache[cacheKey] = apiResponse.Data
-	r.log.Debugf("Persisting error in local cache for: %s", cacheKey)
+	if vtxErrors, ok := r.localCache[cacheKey]; ok {
+		// Update existing replica errors if found
+		for i, vtxError := range vtxErrors {
+			if vtxError.Replica == replica {
+				vtxErrors[i] = newVtxErrors
+				r.localCache[cacheKey] = vtxErrors
+				return
+			}
+		}
+		// Append new replica errors if not found
+		r.localCache[cacheKey] = append(vtxErrors, newVtxErrors)
+	} else {
+		// Initialize the cache entry with the new replica errors
+		r.localCache[cacheKey] = []ReplicaErrors{newVtxErrors}
+	}
 }
 
 // GetLocalCache returns the local cache of runtime errors.
-func (r *pipelineRuntimeCache) GetLocalCache() map[PodReplica][]ErrorDetails {
+func (r *pipelineRuntimeCache) GetLocalCache() map[string][]ReplicaErrors {
 	r.cacheMutex.RLock()
 	defer r.cacheMutex.RUnlock()
 
-	localCacheCopy := make(map[PodReplica][]ErrorDetails, len(r.localCache))
+	localCacheCopy := make(map[string][]ReplicaErrors, len(r.localCache))
 	for key, value := range r.localCache {
-		localCacheValue := make([]ErrorDetails, len(value))
+		localCacheValue := make([]ReplicaErrors, len(value))
 		copy(localCacheValue, value)
 		localCacheCopy[key] = localCacheValue
 	}
diff --git a/pkg/mvtxdaemon/client/grpc_client.go b/pkg/mvtxdaemon/client/grpc_client.go
index c398b138..dbffd7a5 100644
--- a/pkg/mvtxdaemon/client/grpc_client.go
+++ b/pkg/mvtxdaemon/client/grpc_client.go
@@ -62,6 +62,15 @@ func (dc *grpcClient) GetMonoVertexStatus(ctx context.Context) (*mvtxdaemon.Mono
 	}
 }
 
+// GetMonoVertexErrors returns the []ReplicaErrors response instance for GetMonoVertexErrorsRequest
+func (dc *grpcClient) GetMonoVertexErrors(ctx context.Context, monoVertex string) ([]*mvtxdaemon.ReplicaErrors, error) {
+	if rspn, err := dc.client.GetMonoVertexErrors(ctx, &mvtxdaemon.GetMonoVertexErrorsRequest{MonoVertex: monoVertex}); err != nil {
+		return nil, err
+	} else {
+		return rspn.Errors, nil
+	}
+}
+
 // Close function closes the gRPC connection, it has to be called after a daemon client has finished all its jobs.
 func (dc *grpcClient) Close() error {
 	if dc.conn != nil {
diff --git a/pkg/mvtxdaemon/client/interface.go b/pkg/mvtxdaemon/client/interface.go
index 25a7ca1d..53113043 100644
--- a/pkg/mvtxdaemon/client/interface.go
+++ b/pkg/mvtxdaemon/client/interface.go
@@ -27,4 +27,5 @@ type MonoVertexDaemonClient interface {
 	io.Closer
 	GetMonoVertexMetrics(ctx context.Context) (*mvtxdaemon.MonoVertexMetrics, error)
 	GetMonoVertexStatus(ctx context.Context) (*mvtxdaemon.MonoVertexStatus, error)
+	GetMonoVertexErrors(ctx context.Context, monoVertex string) ([]*mvtxdaemon.ReplicaErrors, error)
 }
diff --git a/pkg/mvtxdaemon/client/restful_client.go b/pkg/mvtxdaemon/client/restful_client.go
index 0e08e6f8..c567a973 100644
--- a/pkg/mvtxdaemon/client/restful_client.go
+++ b/pkg/mvtxdaemon/client/restful_client.go
@@ -103,3 +103,17 @@ func (rc *restfulClient) GetMonoVertexStatus(ctx context.Context) (*mvtxdaemon.M
 	}
 
 }
+
+// GetMonoVertexErrors returns the []ReplicaErrors response instance for GetMonoVertexErrorsRequest
+func (rc *restfulClient) GetMonoVertexErrors(ctx context.Context, monoVertex string) ([]*mvtxdaemon.ReplicaErrors, error) {
+	resp, err := rc.httpClient.Get(fmt.Sprintf("%s/api/v1/mono-vertices/%s/errors", rc.hostURL, monoVertex))
+	if err != nil {
+		return nil, fmt.Errorf("failed to call get mono vertex errors RESTful API, %w", err)
+	}
+	defer func() { _ = resp.Body.Close() }()
+	if res, err := unmarshalResponse[mvtxdaemon.GetMonoVertexErrorsResponse](resp); err != nil {
+		return nil, err
+	} else {
+		return res.Errors, nil
+	}
+}
diff --git a/pkg/mvtxdaemon/server/service/mvtx_service.go b/pkg/mvtxdaemon/server/service/mvtx_service.go
index d8e47c3d..e03094bd 100644
--- a/pkg/mvtxdaemon/server/service/mvtx_service.go
+++ b/pkg/mvtxdaemon/server/service/mvtx_service.go
@@ -25,6 +25,7 @@ import (
 
 	"go.uber.org/zap"
 	"google.golang.org/protobuf/types/known/emptypb"
+	"google.golang.org/protobuf/types/known/timestamppb"
 	"google.golang.org/protobuf/types/known/wrapperspb"
 
 	"github.com/prometheus/common/expfmt"
@@ -99,6 +100,40 @@ func (mvs *MonoVertexService) GetMonoVertexStatus(ctx context.Context, empty *em
 	return resp, nil
 }
 
+// GetMonoVertexErrors returns errors for a given mono vertex by accessing the local cache in the runtime service.
+// The errors are persisted in the local cache by the runtime service.
+// Errors are retrieved for all active replicas for a given mono vertex.
+// A list of replica errors for a given mono vertex is returned.
+func (mvs *MonoVertexService) GetMonoVertexErrors(ctx context.Context, request *mvtxdaemon.GetMonoVertexErrorsRequest) (*mvtxdaemon.GetMonoVertexErrorsResponse, error) {
+	monoVertex := request.GetMonoVertex()
+	resp := new(mvtxdaemon.GetMonoVertexErrorsResponse)
+	localCache := mvs.monoVertexRuntimeCache.GetLocalCache()
+
+	// If the errors are present in the local cache, return the errors.
+	if errors, ok := localCache[monoVertex]; ok {
+		replicaErrors := make([]*mvtxdaemon.ReplicaErrors, len(errors))
+		for i, err := range errors {
+			containerErrors := make([]*mvtxdaemon.ContainerError, len(err.ContainerErrors))
+			for j, containerError := range err.ContainerErrors {
+				containerErrors[j] = &mvtxdaemon.ContainerError{
+					Container: containerError.Container,
+					Timestamp: timestamppb.New(time.Unix(containerError.Timestamp, 0)),
+					Code:      containerError.Code,
+					Message:   containerError.Message,
+					Details:   containerError.Details,
+				}
+			}
+			replicaErrors[i] = &mvtxdaemon.ReplicaErrors{
+				Replica:         err.Replica,
+				ContainerErrors: containerErrors,
+			}
+		}
+		resp.Errors = replicaErrors
+	}
+
+	return resp, nil
+}
+
 // getPending returns the pending count for the mono vertex
 func (mvs *MonoVertexService) getPending(ctx context.Context) map[string]*wrapperspb.Int64Value {
 	log := logging.FromContext(ctx)
diff --git a/pkg/mvtxdaemon/server/service/runtime/runtime.go b/pkg/mvtxdaemon/server/service/runtime/runtime.go
index 516fb734..7af22e64 100644
--- a/pkg/mvtxdaemon/server/service/runtime/runtime.go
+++ b/pkg/mvtxdaemon/server/service/runtime/runtime.go
@@ -37,30 +37,37 @@ const (
 	runtimeErrorsTimeStep = 60 * time.Second
 )
 
+// ErrorDetails is used to provide information for a container error
+// including timestamp, error code, message and details
+type ErrorDetails struct {
+	Container string `json:"container"`
+	Timestamp int64  `json:"timestamp"`
+	Code      string `json:"code"`
+	Message   string `json:"message"`
+	Details   string `json:"details"`
+}
+
+type ErrorApiResponse struct {
+	ErrMessage string         `json:"errorMessage"`
+	Data       []ErrorDetails `json:"data"`
+}
+
+// ReplicaErrors is used to provide all the container errors for a replica
+type ReplicaErrors struct {
+	Replica         string         `json:"replica"`
+	ContainerErrors []ErrorDetails `json:"containerErrors"`
+}
+
 // MonoVertexRuntimeCache is an interface for caching and retrieving the runtime information.
 type MonoVertexRuntimeCache interface {
 	// StartCacheRefresher starts the cache refresher to update the local cache with the runtime errors.
 	StartCacheRefresher(ctx context.Context) error
-	// GetLocalCache returns the local cache of runtime errors.
-	GetLocalCache() map[PodReplica][]ErrorDetails
+	// GetLocalCache returns the local cache of runtime errors for each monoVertex.
+	GetLocalCache() map[string][]ReplicaErrors
 }
 
 var _ MonoVertexRuntimeCache = (*monoVertexRuntimeCache)(nil)
 
-type PodReplica string
-
-type ErrorApiResponse struct {
-	ErrMessage string         `json:"error_message"`
-	Data       []ErrorDetails `json:"data"`
-}
-type ErrorDetails struct {
-	Container string `json:"container"`
-	Timestamp string `json:"timestamp"`
-	Code      string `json:"code"`
-	Message   string `json:"message"`
-	Details   string `json:"details"`
-}
-
 type monitorHttpClient interface {
 	Get(url string) (*http.Response, error)
 	Head(url string) (*http.Response, error)
@@ -70,7 +77,7 @@ type monitorHttpClient interface {
 // It implements the MonoVertexRuntimeCache interface.
 type monoVertexRuntimeCache struct {
 	monoVtx    *v1alpha1.MonoVertex
-	localCache map[PodReplica][]ErrorDetails
+	localCache map[string][]ReplicaErrors
 	cacheMutex sync.RWMutex
 	podTracker *PodTracker
 	log        *zap.SugaredLogger
@@ -81,7 +88,7 @@ type monoVertexRuntimeCache struct {
 func NewRuntime(ctx context.Context, mv *v1alpha1.MonoVertex) MonoVertexRuntimeCache {
 	return &monoVertexRuntimeCache{
 		monoVtx:    mv,
-		localCache: make(map[PodReplica][]ErrorDetails),
+		localCache: make(map[string][]ReplicaErrors),
 		cacheMutex: sync.RWMutex{},
 		log:        logging.FromContext(ctx).Named("monoVertexRuntimeCache"),
 		httpClient: &http.Client{
@@ -180,25 +187,41 @@ func (r *monoVertexRuntimeCache) fetchAndPersistErrorForPod(podIndex int) {
 		return
 	}
 
-	cacheKey := PodReplica(fmt.Sprintf("%s-mv-%v", r.monoVtx.Name, podIndex))
+	cacheKey := r.monoVtx.Name
+	replica := fmt.Sprintf("%s-mv-%v", cacheKey, podIndex)
+	newMvtxErrors := ReplicaErrors{Replica: replica, ContainerErrors: apiResponse.Data}
 
+	r.log.Debugf("Persisting error in local cache for: %s", cacheKey)
 	// Lock the cache before updating
 	r.cacheMutex.Lock()
 	defer r.cacheMutex.Unlock()
 
 	// overwrite the errors
-	r.localCache[cacheKey] = apiResponse.Data
-	r.log.Debugf("Persisting error in local cache for: %s", cacheKey)
+	if mvtxErrors, ok := r.localCache[cacheKey]; ok {
+		// Update existing replica errors if found
+		for i, mvtxError := range mvtxErrors {
+			if mvtxError.Replica == replica {
+				mvtxErrors[i] = newMvtxErrors
+				r.localCache[cacheKey] = mvtxErrors
+				return
+			}
+		}
+		// Append new replica errors if not found
+		r.localCache[cacheKey] = append(mvtxErrors, newMvtxErrors)
+	} else {
+		// Initialize the cache entry with the new replica errors
+		r.localCache[cacheKey] = []ReplicaErrors{newMvtxErrors}
+	}
 }
 
 // GetLocalCache returns the local cache of runtime errors.
-func (r *monoVertexRuntimeCache) GetLocalCache() map[PodReplica][]ErrorDetails {
+func (r *monoVertexRuntimeCache) GetLocalCache() map[string][]ReplicaErrors {
 	r.cacheMutex.RLock()
 	defer r.cacheMutex.RUnlock()
 
-	localCacheCopy := make(map[PodReplica][]ErrorDetails, len(r.localCache))
+	localCacheCopy := make(map[string][]ReplicaErrors, len(r.localCache))
 	for key, value := range r.localCache {
-		localCacheValue := make([]ErrorDetails, len(value))
+		localCacheValue := make([]ReplicaErrors, len(value))
 		copy(localCacheValue, value)
 		localCacheCopy[key] = localCacheValue
 	}
diff --git a/rust/numaflow-monitor/src/runtime.rs b/rust/numaflow-monitor/src/runtime.rs
index 437618c4..0e8be0fb 100644
--- a/rust/numaflow-monitor/src/runtime.rs
+++ b/rust/numaflow-monitor/src/runtime.rs
@@ -1,7 +1,7 @@
 //! The `runtime` module is responsible for persisting runtime information, such as application errors.
 use crate::config::RuntimeInfoConfig;
 use crate::error::{Error, Result};
-use chrono::{DateTime, Utc};
+use chrono::Utc;
 use serde::{Deserialize, Serialize};
 use std::convert::TryFrom;
 use std::fs;
@@ -19,8 +19,8 @@ const CURRENT_FILE: &str = "current-numa.json";
 pub(crate) struct RuntimeErrorEntry {
     /// The name of the container where the error occurred.
     pub(crate) container: String,
-    /// The timestamp of the error in RFC 3339 format.
-    pub(crate) timestamp: String,
+    /// The timestamp of the error.
+    pub(crate) timestamp: i64,
     /// The error code.
     pub(crate) code: String,
     /// The error message.
@@ -50,14 +50,9 @@ impl From<(&Status, &str, i64)> for RuntimeErrorEntry {
         // Convert status details from bytes to a string
         let details_str = String::from_utf8_lossy(details_bytes);
 
-        // Convert timestamp to RFC 3339 string
-        let rfc3339_timestamp = DateTime::<Utc>::from_timestamp(timestamp, 0)
-            .unwrap()
-            .to_rfc3339();
-
         RuntimeErrorEntry {
             container: container_name.to_string(),
-            timestamp: rfc3339_timestamp,
+            timestamp: timestamp,
             code,
             message,
             details: details_str.to_string(),
@@ -75,6 +70,7 @@ impl From<RuntimeErrorEntry> for String {
 #[derive(serde::Serialize, serde::Deserialize)]
 pub(crate) struct ApiResponse {
     /// Optional error message for the API response.
+    #[serde(rename = "errorMessage")]
     pub(crate) error_message: Option<String>,
     /// A list of `RuntimeErrorEntry` objects
     pub(crate) data: Vec<RuntimeErrorEntry>,
@@ -385,7 +381,7 @@ mod tests {
         let mut file = fs::File::create(&file_path).unwrap();
         let content = r#"{
                 "container": "test_container",
-                "timestamp": "1234567890",
+                "timestamp": 1234567890,
                 "code": "Internal error",
                 "message": "An error occurred",
                 "details": "Error details"
@@ -404,7 +400,7 @@ mod tests {
 
         assert_eq!(errors.len(), 1);
         assert_eq!(errors[0].container, "test_container");
-        assert_eq!(errors[0].timestamp, "1234567890");
+        assert_eq!(errors[0].timestamp, 1234567890);
         assert_eq!(errors[0].code, "Internal error");
         assert_eq!(errors[0].message, "An error occurred");
         assert_eq!(errors[0].details, "Error details");
@@ -417,7 +413,7 @@ mod tests {
         let mut file = fs::File::create(&file_path).unwrap();
         let invalid_content = r#"{
                 "container": "test_container",
-                "timestamp": 1234,
+                "timestamp": "1234",
                 "code": "Internal error",
                 "message": "An error occurred",
                 "details": "Error details"
diff --git a/server/apis/interface.go b/server/apis/interface.go
index 45b11442..7053de6b 100644
--- a/server/apis/interface.go
+++ b/server/apis/interface.go
@@ -51,4 +51,6 @@ type Handler interface {
 	GetMonoVertexMetrics(c *gin.Context)
 	GetMetricData(c *gin.Context)
 	DiscoverMetrics(c *gin.Context)
+	GetVertexErrors(c *gin.Context)
+	GetMonoVertexErrors(c *gin.Context)
 }
diff --git a/server/apis/v1/handler.go b/server/apis/v1/handler.go
index 151906ff..f6020a1a 100644
--- a/server/apis/v1/handler.go
+++ b/server/apis/v1/handler.go
@@ -1262,6 +1262,44 @@ func (h *handler) GetMonoVertexHealth(c *gin.Context) {
 	c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, response))
 }
 
+// GetVertexErrors is used to provide the errors of a given vertex
+func (h *handler) GetVertexErrors(c *gin.Context) {
+	ns, pipeline, vertex := c.Param("namespace"), c.Param("pipeline"), c.Param("vertex")
+
+	client, err := h.getPipelineDaemonClient(ns, pipeline)
+	if err != nil || client == nil {
+		h.respondWithError(c, fmt.Sprintf("failed to get daemon service client for pipeline %q, %s", pipeline, err.Error()))
+		return
+	}
+
+	errors, err := client.GetVertexErrors(c, pipeline, vertex)
+	if err != nil {
+		h.respondWithError(c, fmt.Sprintf("Failed to get the errors for pipeline %q vertex %q: %s", pipeline, vertex, err.Error()))
+		return
+	}
+
+	c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, errors))
+}
+
+// GetMonoVertexErrors is used to provide the errors of a given mono vertex
+func (h *handler) GetMonoVertexErrors(c *gin.Context) {
+	ns, monoVertex := c.Param("namespace"), c.Param("mono-vertex")
+
+	client, err := h.getMonoVertexDaemonClient(ns, monoVertex)
+	if err != nil || client == nil {
+		h.respondWithError(c, fmt.Sprintf("failed to get daemon service client for mono vertex %q, %s", monoVertex, err.Error()))
+		return
+	}
+
+	errors, err := client.GetMonoVertexErrors(c, monoVertex)
+	if err != nil {
+		h.respondWithError(c, fmt.Sprintf("Failed to get the errors for mono vertex %q: %s", monoVertex, err.Error()))
+		return
+	}
+
+	c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, errors))
+}
+
 func (h *handler) GetMetricData(c *gin.Context) {
 	var requestBody MetricsRequestBody
 	if h.promQlServiceObj == nil {
diff --git a/server/cmd/server/start.go b/server/cmd/server/start.go
index 2cb651e4..d5299d13 100644
--- a/server/cmd/server/start.go
+++ b/server/cmd/server/start.go
@@ -209,6 +209,8 @@ func CreateAuthRouteMap(baseHref string) authz.RouteMap {
 		"GET:" + baseHref + "api/v1/namespaces/:namespace/mono-vertices/:mono-vertex/metrics":             authz.NewRouteInfo(authz.ObjectMonoVertex, true),
 		"POST:" + baseHref + "api/v1/namespaces/:namespace/mono-vertices":                                 authz.NewRouteInfo(authz.ObjectMonoVertex, true),
 		"GET:" + baseHref + "api/v1/namespaces/:namespace/mono-vertices/:mono-vertex/health":              authz.NewRouteInfo(authz.ObjectMonoVertex, true),
+		"GET:" + baseHref + "api/v1/namespaces/:namespace/pipelines/:pipeline/vertices/:vertex/errors":    authz.NewRouteInfo(authz.ObjectPipeline, true),
+		"GET:" + baseHref + "api/v1/namespaces/:namespace/mono-vertices/:mono-vertex/errors":              authz.NewRouteInfo(authz.ObjectMonoVertex, true),
 		"POST:" + baseHref + "api/v1/metrics-proxy":                                                       authz.NewRouteInfo(authz.ObjectAll, true),
 		"GET:" + baseHref + "api/v1/metrics-discovery/object/:object":                                     authz.NewRouteInfo(authz.ObjectAll, true),
 	}
diff --git a/server/routes/routes.go b/server/routes/routes.go
index 500a32a5..26b8e602 100644
--- a/server/routes/routes.go
+++ b/server/routes/routes.go
@@ -181,6 +181,10 @@ func v1Routes(ctx context.Context, r gin.IRouter, dexObj *v1.DexObject, localUse
 	r.GET("/namespaces/:namespace/mono-vertices/:mono-vertex/metrics", handler.GetMonoVertexMetrics)
 	// Get the health information of a mono vertex.
 	r.GET("/namespaces/:namespace/mono-vertices/:mono-vertex/health", handler.GetMonoVertexHealth)
+	// Get the errors for a given pipeline vertex replica.
+	r.GET("/namespaces/:namespace/pipelines/:pipeline/vertices/:vertex/errors", handler.GetVertexErrors)
+	// Get the errors for a given mono vertex replica.
+	r.GET("/namespaces/:namespace/mono-vertices/:mono-vertex/errors", handler.GetMonoVertexErrors)
 	// Get the time series data across different dimensions.
 	r.POST("/metrics-proxy", handler.GetMetricData)
 	// Discover the metrics for a given object type.



Test patch:
diff --git a/pkg/daemon/client/grpc_daemon_client_test.go b/pkg/daemon/client/grpc_daemon_client_test.go
index 905d9638..8c9e6fd5 100644
--- a/pkg/daemon/client/grpc_daemon_client_test.go
+++ b/pkg/daemon/client/grpc_daemon_client_test.go
@@ -20,10 +20,12 @@ import (
 	"context"
 	"errors"
 	"testing"
+	"time"
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 	"google.golang.org/grpc"
+	"google.golang.org/protobuf/types/known/timestamppb"
 	"google.golang.org/protobuf/types/known/wrapperspb"
 
 	"github.com/numaproj/numaflow/pkg/apis/proto/daemon"
@@ -58,6 +60,11 @@ func (m *mockDaemonServiceClient) GetPipelineStatus(ctx context.Context, in *dae
 	return args.Get(0).(*daemon.GetPipelineStatusResponse), args.Error(1)
 }
 
+func (m *mockDaemonServiceClient) GetVertexErrors(ctx context.Context, in *daemon.GetVertexErrorsRequest, opts ...grpc.CallOption) (*daemon.GetVertexErrorsResponse, error) {
+	args := m.Called(ctx, in, opts)
+	return args.Get(0).(*daemon.GetVertexErrorsResponse), args.Error(1)
+}
+
 func TestGrpcDaemonClient_ListPipelineBuffers(t *testing.T) {
 	t.Run("successful listing", func(t *testing.T) {
 		mockClient := new(mockDaemonServiceClient)
@@ -366,6 +373,75 @@ func TestGrpcDaemonClient_GetPipelineStatus(t *testing.T) {
 		assert.Nil(t, status)
 	})
 }
+
+func TestGrpcDaemonClient_GetVertexErrors(t *testing.T) {
+	t.Run("successful retrieval", func(t *testing.T) {
+		mockClient := new(mockDaemonServiceClient)
+		dc := &grpcDaemonClient{client: mockClient}
+
+		expectedErrors := make([]*daemon.ReplicaErrors, 0)
+		expectedErrors = append(expectedErrors, &daemon.ReplicaErrors{
+			Replica: "0",
+			ContainerErrors: []*daemon.ContainerError{{
+				Container: "container1",
+				Timestamp: timestamppb.New(time.Unix(1743673441, 0)),
+				Code:      "Internal",
+				Message:   "message1",
+				Details:   "details1",
+			}},
+		})
+
+		mockClient.On("GetVertexErrors", mock.Anything, &daemon.GetVertexErrorsRequest{Pipeline: "test-pipeline", Vertex: "test-vertex"}, mock.Anything).
+			Return(&daemon.GetVertexErrorsResponse{Errors: expectedErrors}, nil)
+
+		vertexErrors, err := dc.GetVertexErrors(context.Background(), "test-pipeline", "test-vertex")
+		assert.NoError(t, err)
+		assert.Equal(t, expectedErrors, vertexErrors)
+	})
+
+	t.Run("empty errors", func(t *testing.T) {
+		mockClient := new(mockDaemonServiceClient)
+		dc := &grpcDaemonClient{client: mockClient}
+
+		mockClient.On("GetVertexErrors", mock.Anything, &daemon.GetVertexErrorsRequest{Pipeline: "test-pipeline", Vertex: "vertex1"}, mock.Anything).
+			Return(&daemon.GetVertexErrorsResponse{Errors: []*daemon.ReplicaErrors{}}, nil)
+
+		vertexErrors, err := dc.GetVertexErrors(context.Background(), "test-pipeline", "vertex1")
+		assert.NoError(t, err)
+		assert.Empty(t, vertexErrors)
+	})
+
+	t.Run("client error", func(t *testing.T) {
+		mockClient := new(mockDaemonServiceClient)
+		dc := &grpcDaemonClient{client: mockClient}
+
+		expectedError := errors.New("client error")
+		mockClient.On("GetVertexErrors", mock.Anything, &daemon.GetVertexErrorsRequest{Pipeline: "test-pipeline", Vertex: "test-vertex"}, mock.Anything).
+			Return((*daemon.GetVertexErrorsResponse)(nil), expectedError)
+
+		vertexErrors, err := dc.GetVertexErrors(context.Background(), "test-pipeline", "test-vertex")
+		assert.Error(t, err)
+		assert.Equal(t, expectedError, err)
+		assert.Nil(t, vertexErrors)
+	})
+
+	t.Run("context cancellation", func(t *testing.T) {
+		mockClient := new(mockDaemonServiceClient)
+		dc := &grpcDaemonClient{client: mockClient}
+
+		ctx, cancel := context.WithCancel(context.Background())
+		cancel()
+
+		mockClient.On("GetVertexErrors", mock.Anything, &daemon.GetVertexErrorsRequest{Pipeline: "test-pipeline", Vertex: "test-vertex"}, mock.Anything).
+			Return((*daemon.GetVertexErrorsResponse)(nil), context.Canceled)
+
+		vertexErrors, err := dc.GetVertexErrors(ctx, "test-pipeline", "test-vertex")
+		assert.Error(t, err)
+		assert.Equal(t, context.Canceled, err)
+		assert.Nil(t, vertexErrors)
+	})
+}
+
 func TestGrpcDaemonClient_IsDrained(t *testing.T) {
 	t.Run("all buffers empty", func(t *testing.T) {
 		mockClient := new(mockDaemonServiceClient)
diff --git a/pkg/daemon/client/restful_daemon_client_test.go b/pkg/daemon/client/restful_daemon_client_test.go
index 9aedf384..8acf7a44 100644
--- a/pkg/daemon/client/restful_daemon_client_test.go
+++ b/pkg/daemon/client/restful_daemon_client_test.go
@@ -201,6 +201,35 @@ func TestRestfulDaemonClient_GetPipelineStatus(t *testing.T) {
 	})
 }
 
+func TestRestfulDaemonClient_GetVertexErrors(t *testing.T) {
+	t.Run("error case", func(t *testing.T) {
+		server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+			w.WriteHeader(http.StatusOK)
+			_, _ = w.Write([]byte(`invalid json`))
+		}))
+		defer server.Close()
+
+		client, _ := NewRESTfulDaemonServiceClient(server.URL)
+		_, err := client.GetVertexErrors(context.Background(), "simple-pipeline", "out")
+		assert.Error(t, err)
+	})
+
+	t.Run("okay", func(t *testing.T) {
+		server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+			w.WriteHeader(http.StatusOK)
+			_, _ = w.Write([]byte(`{"errors":[{"replica":"0","containerErrors":[{"container":"container1","timestamp":"2023-10-01T12:00:00Z","code":"Internal","message":"message1","details":"details1"}]}]}`))
+		}))
+		defer server.Close()
+
+		client, _ := NewRESTfulDaemonServiceClient(server.URL)
+		errors, err := client.GetVertexErrors(context.Background(), "simple-pipeline", "out")
+		assert.NoError(t, err)
+		assert.Len(t, errors, 1)
+		assert.Equal(t, "container1", errors[0].ContainerErrors[0].Container)
+		assert.Equal(t, "Internal", errors[0].ContainerErrors[0].Code)
+	})
+}
+
 func TestRestfulDaemonClient_Close(t *testing.T) {
 	t.Run("close without error", func(t *testing.T) {
 		client := &restfulDaemonClient{}
diff --git a/server/cmd/server/start_test.go b/server/cmd/server/start_test.go
index 574408a6..f85aa416 100644
--- a/server/cmd/server/start_test.go
+++ b/server/cmd/server/start_test.go
@@ -25,12 +25,12 @@ import (
 func TestCreateAuthRouteMap(t *testing.T) {
 	t.Run("empty base", func(t *testing.T) {
 		got := CreateAuthRouteMap("")
-		assert.Equal(t, 34, len(got))
+		assert.Equal(t, 36, len(got))
 	})
 
 	t.Run("customize base", func(t *testing.T) {
 		got := CreateAuthRouteMap("abcdefg")
-		assert.Equal(t, 34, len(got))
+		assert.Equal(t, 36, len(got))
 		for k := range got {
 			assert.Contains(t, k, "abcdefg")
 		}