Add additional performance spans

This commit is contained in:
Maximilian Paß
2023-02-02 17:51:05 +00:00
parent 689344bd79
commit f2c205a8ed
19 changed files with 92 additions and 51 deletions

View File

@ -4,6 +4,7 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/getsentry/sentry-go"
"github.com/gorilla/mux"
"github.com/openHPI/poseidon/internal/environment"
"github.com/openHPI/poseidon/internal/runner"
@ -118,7 +119,9 @@ func (e *EnvironmentController) createOrUpdate(writer http.ResponseWriter, reque
return
}
created, err := e.manager.CreateOrUpdate(environmentID, *req)
span := sentry.StartSpan(request.Context(), "Create Environment")
created, err := e.manager.CreateOrUpdate(environmentID, *req, request.Context())
span.Finish()
if err != nil {
writeInternalServerError(writer, err, dto.ErrorUnknown)
}

View File

@ -246,7 +246,7 @@ func (s *CreateOrUpdateEnvironmentTestSuite) TestReturnsBadRequestWhenBadBody()
func (s *CreateOrUpdateEnvironmentTestSuite) TestReturnsInternalServerErrorWhenManagerReturnsError() {
testError := tests.ErrDefault
s.manager.
On("CreateOrUpdate", s.id, mock.AnythingOfType("dto.ExecutionEnvironmentRequest")).
On("CreateOrUpdate", s.id, mock.AnythingOfType("dto.ExecutionEnvironmentRequest"), mock.Anything).
Return(false, testError)
recorder := s.recordRequest()
@ -256,7 +256,7 @@ func (s *CreateOrUpdateEnvironmentTestSuite) TestReturnsInternalServerErrorWhenM
func (s *CreateOrUpdateEnvironmentTestSuite) TestReturnsCreatedIfNewEnvironment() {
s.manager.
On("CreateOrUpdate", s.id, mock.AnythingOfType("dto.ExecutionEnvironmentRequest")).
On("CreateOrUpdate", s.id, mock.AnythingOfType("dto.ExecutionEnvironmentRequest"), mock.Anything).
Return(true, nil)
recorder := s.recordRequest()
@ -265,7 +265,7 @@ func (s *CreateOrUpdateEnvironmentTestSuite) TestReturnsCreatedIfNewEnvironment(
func (s *CreateOrUpdateEnvironmentTestSuite) TestReturnsNoContentIfNotNewEnvironment() {
s.manager.
On("CreateOrUpdate", s.id, mock.AnythingOfType("dto.ExecutionEnvironmentRequest")).
On("CreateOrUpdate", s.id, mock.AnythingOfType("dto.ExecutionEnvironmentRequest"), mock.Anything).
Return(false, nil)
recorder := s.recordRequest()

View File

@ -3,6 +3,7 @@ package api
import (
"errors"
"fmt"
"github.com/getsentry/sentry-go"
"github.com/google/uuid"
"github.com/gorilla/mux"
"github.com/openHPI/poseidon/internal/config"
@ -65,7 +66,9 @@ func (r *RunnerController) provide(writer http.ResponseWriter, request *http.Req
}
environmentID := dto.EnvironmentID(runnerRequest.ExecutionEnvironmentID)
span := sentry.StartSpan(request.Context(), "Claim Runner")
nextRunner, err := r.manager.Claim(environmentID, runnerRequest.InactivityTimeout)
span.Finish()
if err != nil {
switch {
case errors.Is(err, runner.ErrUnknownExecutionEnvironment):
@ -103,7 +106,9 @@ func (r *RunnerController) listFileSystem(writer http.ResponseWriter, request *h
}
writer.Header().Set("Content-Type", "application/json")
span := sentry.StartSpan(request.Context(), "List File System")
err = targetRunner.ListFileSystem(path, recursive, writer, privilegedExecution, request.Context())
span.Finish()
if errors.Is(err, runner.ErrFileNotFound) {
writeClientError(writer, err, http.StatusFailedDependency)
return
@ -125,7 +130,11 @@ func (r *RunnerController) updateFileSystem(writer http.ResponseWriter, request
targetRunner, _ := runner.FromContext(request.Context())
monitoring.AddRunnerMonitoringData(request, targetRunner.ID(), targetRunner.Environment())
if err := targetRunner.UpdateFileSystem(fileCopyRequest); err != nil {
span := sentry.StartSpan(request.Context(), "Update File System")
err := targetRunner.UpdateFileSystem(fileCopyRequest, request.Context())
span.Finish()
if err != nil {
log.WithError(err).Error("Could not perform the requested updateFileSystem.")
writeInternalServerError(writer, err, dto.ErrorUnknown)
return
@ -144,7 +153,9 @@ func (r *RunnerController) fileContent(writer http.ResponseWriter, request *http
}
writer.Header().Set("Content-Disposition", "attachment; filename=\""+path+"\"")
span := sentry.StartSpan(request.Context(), "File Content")
err = targetRunner.GetFileContent(path, writer, privilegedExecution, request.Context())
span.Finish()
if errors.Is(err, runner.ErrFileNotFound) {
writeClientError(writer, err, http.StatusFailedDependency)
return
@ -191,7 +202,9 @@ func (r *RunnerController) execute(writer http.ResponseWriter, request *http.Req
return
}
id := newUUID.String()
span := sentry.StartSpan(request.Context(), "Store Execution")
targetRunner.StoreExecution(id, executionRequest)
span.Finish()
webSocketURL := url.URL{
Scheme: scheme,
Host: request.Host,
@ -230,7 +243,9 @@ func (r *RunnerController) delete(writer http.ResponseWriter, request *http.Requ
targetRunner, _ := runner.FromContext(request.Context())
monitoring.AddRunnerMonitoringData(request, targetRunner.ID(), targetRunner.Environment())
span := sentry.StartSpan(request.Context(), "Return Runner")
err := r.manager.Return(targetRunner)
span.Finish()
if err != nil {
writeInternalServerError(writer, err, dto.ErrorNomadInternalServerError)
return

View File

@ -277,7 +277,8 @@ func (s *UpdateFileSystemRouteTestSuite) SetupTest() {
}
func (s *UpdateFileSystemRouteTestSuite) TestUpdateFileSystemReturnsNoContentOnValidRequest() {
s.runnerMock.On("UpdateFileSystem", mock.AnythingOfType("*dto.UpdateFileSystemRequest")).Return(nil)
s.runnerMock.On("UpdateFileSystem", mock.AnythingOfType("*dto.UpdateFileSystemRequest"), mock.Anything).
Return(nil)
copyRequest := dto.UpdateFileSystemRequest{}
body, err := json.Marshal(copyRequest)
@ -287,7 +288,8 @@ func (s *UpdateFileSystemRouteTestSuite) TestUpdateFileSystemReturnsNoContentOnV
s.router.ServeHTTP(s.recorder, request)
s.Equal(http.StatusNoContent, s.recorder.Code)
s.runnerMock.AssertCalled(s.T(), "UpdateFileSystem", mock.AnythingOfType("*dto.UpdateFileSystemRequest"))
s.runnerMock.AssertCalled(s.T(), "UpdateFileSystem",
mock.AnythingOfType("*dto.UpdateFileSystemRequest"), mock.Anything)
}
func (s *UpdateFileSystemRouteTestSuite) TestUpdateFileSystemReturnsBadRequestOnInvalidRequestBody() {
@ -314,7 +316,7 @@ func (s *UpdateFileSystemRouteTestSuite) TestUpdateFileSystemToNonExistingRunner
func (s *UpdateFileSystemRouteTestSuite) TestUpdateFileSystemReturnsInternalServerErrorWhenCopyFailed() {
s.runnerMock.
On("UpdateFileSystem", mock.AnythingOfType("*dto.UpdateFileSystemRequest")).
On("UpdateFileSystem", mock.AnythingOfType("*dto.UpdateFileSystemRequest"), mock.Anything).
Return(runner.ErrorFileCopyFailed)
copyRequest := dto.UpdateFileSystemRequest{}

View File

@ -4,6 +4,7 @@ import (
"context"
"errors"
"fmt"
"github.com/getsentry/sentry-go"
"github.com/gorilla/websocket"
"github.com/openHPI/poseidon/internal/api/ws"
"github.com/openHPI/poseidon/internal/runner"
@ -96,6 +97,8 @@ func (r *RunnerController) connectToRunner(writer http.ResponseWriter, request *
log.WithField("runnerId", targetRunner.ID()).
WithField("executionID", logging.RemoveNewlineSymbol(executionID)).
Info("Running execution")
span := sentry.StartSpan(request.Context(), "Execute Interactively")
defer span.Finish()
exit, cancel, err := targetRunner.ExecuteInteractively(executionID,
proxy.Input, proxy.Output.StdOut(), proxy.Output.StdErr())
if err != nil {