Submit feedback using another platform

This commit is contained in:
James Cole
2021-05-28 23:11:12 +02:00
parent 312472e7bb
commit 12c2c58afd
4 changed files with 1068 additions and 36 deletions

View File

@@ -34,10 +34,10 @@ use Illuminate\Http\Request;
use Illuminate\Session\TokenMismatchException;
use Illuminate\Support\Arr;
use Illuminate\Validation\ValidationException as LaravelValidationException;
use League\OAuth2\Server\Exception\OAuthServerException;
use Laravel\Passport\Exceptions\OAuthServerException as LaravelOAuthException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use League\OAuth2\Server\Exception\OAuthServerException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Throwable;
/**
@@ -58,7 +58,7 @@ class Handler extends ExceptionHandler
OAuthServerException::class,
LaravelOAuthException::class,
TokenMismatchException::class,
HttpException::class
HttpException::class,
];
/**
@@ -138,6 +138,15 @@ class Handler extends ExceptionHandler
*/
public function report(Throwable $e)
{
// do sentry (telemetry)
if (!(false === config('firefly.send_telemetry') || false === config('firefly.feature_flags.telemetry'))) {
if (app()->bound('sentry') && $this->shouldReport($e)) {
app('sentry')->captureException($e);
}
}
// do email the user (no telemetry)
$doMailError = config('firefly.send_error_message');
if ($this->shouldntReportLocal($e) || !$doMailError) {
parent::report($e);

View File

@@ -38,6 +38,9 @@ use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Collection;
use JsonException;
use Log;
use Sentry\State\Scope;
use function Sentry\captureMessage;
use function Sentry\configureScope;
/**
* Class SubmitTelemetryData
@@ -78,40 +81,58 @@ class SubmitTelemetryData implements ShouldQueue
return;
}
$json = $this->parseJson($telemetry);
try {
$body = json_encode($json, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
Log::error($e->getMessage());
Log::error('Could not parse JSON.');
throw new FireflyException(sprintf('Could not parse telemetry JSON: %s', $e->getMessage()), 0, $e);
}
// submit to Sentry one by one:
/** @var Telemetry $entry */
foreach($telemetry as $entry) {
$client = new Client;
$options = [
'body' => $body,
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'connect_timeout' => 3.14,
'User-Agent' => sprintf('FireflyIII/%s', config('firefly.version')),
],
];
try {
$result = $client->post($url, $options);
} catch (GuzzleException | Exception $e) {
Log::error($e->getMessage());
Log::error($e->getTraceAsString());
Log::error('Could not submit telemetry.');
throw new FireflyException(sprintf('Could not submit telemetry: %s', $e->getMessage()), 0, $e);
}
$body = (string)$result->getBody();
$statusCode = $result->getStatusCode();
Log::info(sprintf('Result of submission [%d]: %s', $statusCode, $body));
if (200 === $statusCode) {
// mark as submitted:
$this->markAsSubmitted($telemetry);
configureScope(function (Scope $scope) use ($entry): void {
$scope->setContext('telemetry', [
'installation_id' => $entry->installation_id,
'collected_at' => $entry->created_at->format('r'),
'type' => $entry->type,
'key' => $entry->key,
'value' => $entry->value,
]);
});
captureMessage('Telemetry submission');
}
$this->markAsSubmitted($telemetry);
// $json = $this->parseJson($telemetry);
// try {
// $body = json_encode($json, JSON_THROW_ON_ERROR);
// } catch (JsonException $e) {
// Log::error($e->getMessage());
// Log::error('Could not parse JSON.');
// throw new FireflyException(sprintf('Could not parse telemetry JSON: %s', $e->getMessage()), 0, $e);
// }
//
// $client = new Client;
// $options = [
// 'body' => $body,
// 'headers' => [
// 'Content-Type' => 'application/json',
// 'Accept' => 'application/json',
// 'connect_timeout' => 3.14,
// 'User-Agent' => sprintf('FireflyIII/%s', config('firefly.version')),
// ],
// ];
// try {
// $result = $client->post($url, $options);
// } catch (GuzzleException | Exception $e) {
// Log::error($e->getMessage());
// Log::error($e->getTraceAsString());
// Log::error('Could not submit telemetry.');
// throw new FireflyException(sprintf('Could not submit telemetry: %s', $e->getMessage()), 0, $e);
// }
// $body = (string)$result->getBody();
// $statusCode = $result->getStatusCode();
// Log::info(sprintf('Result of submission [%d]: %s', $statusCode, $body));
// if (200 === $statusCode) {
// // mark as submitted:
// $this->markAsSubmitted($telemetry);
// }
}
/**