From de8433cdbb85ca68a18b6a998b761bb4b975a725 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Sun, 6 Nov 2022 11:33:09 +0100 Subject: [PATCH 1/4] Add error details in error logging in Activity Update handler Signed-off-by: Thomas Citharel --- lib/federation/activity_pub/actions/update.ex | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/federation/activity_pub/actions/update.ex b/lib/federation/activity_pub/actions/update.ex index 9c0f860ac..c58032fb2 100644 --- a/lib/federation/activity_pub/actions/update.ex +++ b/lib/federation/activity_pub/actions/update.ex @@ -36,8 +36,7 @@ defmodule Mobilizon.Federation.ActivityPub.Actions.Update do {:ok, activity, entity} {:error, err} -> - Logger.error("Something went wrong while creating an activity") - Logger.debug(inspect(err)) + Logger.error("Something went wrong while creating an activity", err: inspect(err)) {:error, err} end end From 30b0d3ca08224649ac1f9771bc0474e1070da5dd Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Sun, 6 Nov 2022 11:57:53 +0100 Subject: [PATCH 2/4] Add GraphQL operation name, user ID and actor name in logs Signed-off-by: Thomas Citharel --- config/config.exs | 2 +- config/dev.exs | 2 +- .../middleware/current_actor_provider.ex | 8 +++++- .../middleware/operation_name_logger.ex | 27 +++++++++++++++++++ lib/graphql/schema.ex | 4 +-- 5 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 lib/graphql/middleware/operation_name_logger.ex diff --git a/config/config.exs b/config/config.exs index dd5e28b6a..77591db87 100644 --- a/config/config.exs +++ b/config/config.exs @@ -138,7 +138,7 @@ config :vite_phx, config :logger, :console, backends: [:console], format: "$time $metadata[$level] $message\n", - metadata: [:request_id] + metadata: [:request_id, :graphql_operation_name, :user_id, :actor_name] config :mobilizon, Mobilizon.Web.Auth.Guardian, issuer: "mobilizon", diff --git a/config/dev.exs b/config/dev.exs index 77c55e544..6c8418b88 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -48,7 +48,7 @@ config :mobilizon, Mobilizon.Web.Endpoint, ] # Do not include metadata nor timestamps in development logs -config :logger, :console, format: "[$level] $message\n", level: :debug +config :logger, :console, format: "$metadata[$level] $message\n", level: :debug config :mobilizon, Mobilizon.Service.Geospatial, service: Mobilizon.Service.Geospatial.Nominatim diff --git a/lib/graphql/middleware/current_actor_provider.ex b/lib/graphql/middleware/current_actor_provider.ex index abf7384cc..64037f233 100644 --- a/lib/graphql/middleware/current_actor_provider.ex +++ b/lib/graphql/middleware/current_actor_provider.ex @@ -18,7 +18,13 @@ defmodule Mobilizon.GraphQL.Middleware.CurrentActorProvider do case Cachex.fetch(:default_actors, to_string(user_id), fn -> default(user) end) do {status, %Actor{preferred_username: preferred_username} = current_actor} when status in [:ok, :commit] -> - Sentry.Context.set_user_context(%{name: preferred_username}) + Logger.metadata(user_id: user_id) + Logger.metadata(actor_name: "@" <> preferred_username) + + if Application.get_env(:sentry, :dsn) != nil do + Sentry.Context.set_user_context(%{name: preferred_username}) + end + context = Map.put(context, :current_actor, current_actor) %Absinthe.Resolution{resolution | context: context} diff --git a/lib/graphql/middleware/operation_name_logger.ex b/lib/graphql/middleware/operation_name_logger.ex new file mode 100644 index 000000000..7c0a888da --- /dev/null +++ b/lib/graphql/middleware/operation_name_logger.ex @@ -0,0 +1,27 @@ +defmodule Mobilizon.GraphQL.Middleware.OperationNameLogger do + @moduledoc """ + An Absinthe middleware to add to logging providers the GraphQL Operation name as context + """ + + @behaviour Absinthe.Middleware + alias Absinthe.Blueprint.Document.Operation + + def call(resolution, _opts) do + case Enum.find(resolution.path, ¤t_operation?/1) do + %Operation{name: name} when not is_nil(name) -> + Logger.metadata(graphql_operation_name: name) + + if Application.get_env(:sentry, :dsn) != nil do + Sentry.Context.set_extra_context(%{"graphql_operation_name" => name}) + end + + _ -> + Logger.metadata(graphql_operation_name: "#NULL") + end + + resolution + end + + defp current_operation?(%Operation{current: true}), do: true + defp current_operation?(_), do: false +end diff --git a/lib/graphql/schema.ex b/lib/graphql/schema.ex index e89641b4a..8306808d1 100644 --- a/lib/graphql/schema.ex +++ b/lib/graphql/schema.ex @@ -20,7 +20,7 @@ defmodule Mobilizon.GraphQL.Schema do alias Mobilizon.Actors.{Actor, Follower, Member} alias Mobilizon.Discussions.Comment alias Mobilizon.Events.{Event, Participant} - alias Mobilizon.GraphQL.Middleware.{CurrentActorProvider, ErrorHandler} + alias Mobilizon.GraphQL.Middleware.{CurrentActorProvider, ErrorHandler, OperationNameLogger} alias Mobilizon.GraphQL.Schema alias Mobilizon.GraphQL.Schema.Custom alias Mobilizon.Storage.Repo @@ -199,7 +199,7 @@ defmodule Mobilizon.GraphQL.Schema do @spec middleware(list(module()), any(), map()) :: list(module()) def middleware(middleware, _field, %{identifier: type}) when type in [:query, :mutation] do - [CurrentActorProvider] ++ middleware ++ [ErrorHandler] + [CurrentActorProvider] ++ middleware ++ [ErrorHandler, OperationNameLogger] end def middleware(middleware, _field, _object) do From e812b4291bb870755a29fff02d76fe88a02d9274 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Sun, 6 Nov 2022 11:58:17 +0100 Subject: [PATCH 3/4] Add GraphQL query name where it was missing Signed-off-by: Thomas Citharel --- js/src/graphql/admin.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/src/graphql/admin.ts b/js/src/graphql/admin.ts index 768ed65ea..6da9bae56 100644 --- a/js/src/graphql/admin.ts +++ b/js/src/graphql/admin.ts @@ -2,7 +2,7 @@ import gql from "graphql-tag"; import { ACTOR_FRAGMENT } from "./actor"; export const DASHBOARD = gql` - query { + query Dashboard { dashboard { lastPublicEventPublished { id @@ -167,7 +167,7 @@ export const REJECT_RELAY = gql` `; export const LANGUAGES = gql` - query { + query Languages { languages { code name @@ -204,7 +204,7 @@ export const ADMIN_SETTINGS_FRAGMENT = gql` `; export const ADMIN_SETTINGS = gql` - query { + query AdminSettings { adminSettings { ...adminSettingsFragment } From b860dadbfb985295c39b7933804b389479efdbb6 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Sun, 6 Nov 2022 12:53:56 +0100 Subject: [PATCH 4/4] Front-end fixes Signed-off-by: Thomas Citharel --- js/src/components/Group/GroupMemberCard.vue | 4 ++-- js/src/views/Admin/GroupProfiles.vue | 20 ++++++++++++-------- js/src/views/Admin/ProfilesView.vue | 11 ++++++----- js/src/views/Group/MyGroups.vue | 20 ++++++++++---------- js/src/views/Moderation/LogsView.vue | 4 ++-- 5 files changed, 32 insertions(+), 27 deletions(-) diff --git a/js/src/components/Group/GroupMemberCard.vue b/js/src/components/Group/GroupMemberCard.vue index 9f12cd793..3693e38f9 100644 --- a/js/src/components/Group/GroupMemberCard.vue +++ b/js/src/components/Group/GroupMemberCard.vue @@ -20,9 +20,9 @@
-
+
- {{ props.row.name }}
- @{{ props.row.preferredUsername }} +

+ {{ props.row.name }} +

+ @{{ props.row.preferredUsername }}
@@ -117,7 +120,7 @@ import { } from "vue-use-route-query"; import { useI18n } from "vue-i18n"; import { useHead } from "@vueuse/head"; -import { computed } from "vue"; +import { computed, ref } from "vue"; import { Paginate } from "@/types/paginate"; import { IGroup } from "@/types/actor"; import AccountGroup from "vue-material-design-icons/AccountGroup.vue"; @@ -126,9 +129,10 @@ const PROFILES_PER_PAGE = 10; const { restrictions } = useRestrictions(); -const preferredUsername = useRouteQuery("preferredUsername", ""); -const name = useRouteQuery("name", ""); -const domain = useRouteQuery("domain", ""); +const preferredUsername = ref(""); +const name = ref(""); +const domain = ref(""); + const local = useRouteQuery("local", false, booleanTransformer); const suspended = useRouteQuery("suspended", false, booleanTransformer); const page = useRouteQuery("page", 1, integerTransformer); diff --git a/js/src/views/Admin/ProfilesView.vue b/js/src/views/Admin/ProfilesView.vue index 4bd47cb5d..9d51b9207 100644 --- a/js/src/views/Admin/ProfilesView.vue +++ b/js/src/views/Admin/ProfilesView.vue @@ -20,7 +20,7 @@ paginated backend-pagination backend-filtering - :debounce-search="200" + :debounce-search="500" v-model:current-page="page" :aria-next-label="t('Next page')" :aria-previous-label="t('Previous page')" @@ -102,7 +102,7 @@ import RouteName from "@/router/name"; import EmptyContent from "@/components/Utils/EmptyContent.vue"; import { useQuery } from "@vue/apollo-composable"; import { useI18n } from "vue-i18n"; -import { computed } from "vue"; +import { computed, ref } from "vue"; import { useHead } from "@vueuse/head"; import { useRouteQuery, @@ -115,9 +115,10 @@ import Account from "vue-material-design-icons/Account.vue"; const PROFILES_PER_PAGE = 10; -const preferredUsername = useRouteQuery("preferredUsername", ""); -const name = useRouteQuery("name", ""); -const domain = useRouteQuery("domain", ""); +const preferredUsername = ref(""); +const name = ref(""); +const domain = ref(""); + const local = useRouteQuery("local", false, booleanTransformer); const suspended = useRouteQuery("suspended", false, booleanTransformer); const page = useRouteQuery("page", 1, integerTransformer); diff --git a/js/src/views/Group/MyGroups.vue b/js/src/views/Group/MyGroups.vue index 74857c74b..4808380d8 100644 --- a/js/src/views/Group/MyGroups.vue +++ b/js/src/views/Group/MyGroups.vue @@ -1,9 +1,9 @@ diff --git a/js/src/views/Moderation/LogsView.vue b/js/src/views/Moderation/LogsView.vue index cb54fa9ae..3bdd627ad 100644 --- a/js/src/views/Moderation/LogsView.vue +++ b/js/src/views/Moderation/LogsView.vue @@ -21,11 +21,11 @@ >
-
+