Files
zrok/agent/status.go

97 lines
2.8 KiB
Go

package agent
import (
"context"
"sort"
"github.com/openziti/zrok/v2/agent/agentGrpc"
"google.golang.org/protobuf/types/known/timestamppb"
)
func (i *agentGrpcImpl) Status(_ context.Context, _ *agentGrpc.StatusRequest) (*agentGrpc.StatusResponse, error) {
var accesses []*agentGrpc.AccessDetail
// active accesses
for feToken, acc := range i.agent.accesses {
accesses = append(accesses, &agentGrpc.AccessDetail{
FrontendToken: feToken,
Token: acc.token,
BindAddress: acc.bindAddress,
ResponseHeaders: acc.responseHeaders,
Status: "active",
})
}
// failed accesses
for failureId, access := range i.agent.retryManager.accesses {
status := "retrying"
if i.agent.cfg.MaxRetries > -1 && access.Failure.Count >= i.agent.cfg.MaxRetries {
status = "failed"
}
accesses = append(accesses, &agentGrpc.AccessDetail{
FrontendToken: "",
Token: access.Request.ShareToken,
BindAddress: access.Request.BindAddress,
ResponseHeaders: access.Request.ResponseHeaders,
Status: status,
Failure: &agentGrpc.Failure{
Id: failureId,
Count: int32(access.Failure.Count),
LastError: access.Failure.LastError,
NextRetry: timestamppb.New(access.Failure.NextRetry),
},
})
}
sort.Slice(accesses, func(i, j int) bool {
return accesses[i].Token < accesses[j].Token
})
var shares []*agentGrpc.ShareDetail
// active shares
for token, shr := range i.agent.shares {
shares = append(shares, &agentGrpc.ShareDetail{
Token: token,
ShareMode: string(shr.shareMode),
BackendMode: string(shr.backendMode),
FrontendEndpoint: shr.frontendEndpoints,
BackendEndpoint: shr.target,
Closed: shr.closed,
Status: "active",
})
}
// Add failed shares with failure IDs
for failureId, share := range i.agent.retryManager.publicShares {
status := "retrying"
if i.agent.cfg.MaxRetries > -1 && share.Failure.Count >= i.agent.cfg.MaxRetries {
status = "failed"
}
shares = append(shares, &agentGrpc.ShareDetail{
Token: "",
ShareMode: "public",
BackendMode: share.Request.BackendMode,
FrontendEndpoint: nil,
BackendEndpoint: share.Request.Target,
Closed: share.Request.Closed,
Status: status,
Failure: &agentGrpc.Failure{
Id: failureId,
Count: int32(share.Failure.Count),
LastError: share.Failure.LastError,
NextRetry: timestamppb.New(share.Failure.NextRetry),
},
})
}
sort.Slice(shares, func(i, j int) bool {
if shares[i].BackendEndpoint != shares[j].BackendEndpoint {
return shares[i].BackendEndpoint < shares[j].BackendEndpoint
}
return shares[i].Token < shares[j].Token
})
return &agentGrpc.StatusResponse{Accesses: accesses, Shares: shares}, nil
}