Графики взаимоотношений мастодонтов

автор vadim


Новый выпуск Steampipe полностью посвящен графам отношений. В нашем сообщении в блоге показано, как эти графики обеспечивают контекстную осведомленность для специалистов по разработке и безопасности, которые теперь могут видеть все ресурсы, связанные с инстансом EC2, или сразу определять, правильно ли ограничены разрешения, связанные с ролью IAM. Как всегда, разработчики могут исследовать и изменять код, который строит эти графики, и адаптировать идиомы для своих целей в любой предметной области.

Эти графы отношений управляются запросами SQL, которые определяют узлы и ребра. Такие запросы могут использовать любой столбец любой таблицы, предоставляемой любым плагином Steampipe, для формирования узлов, а затем ребер между узлами. Если вы хотите увидеть связи между людьми и объектами, представленными различными API, теперь вы можете использовать идиомы SQL для их графического отображения. Единственным ограничением является ваше воображение.

Естественно, я представил себе график взаимоотношений мастодонтов. На данный момент я построил два графика, которые визуализируют мою домашнюю временную шкалу. Вот первый.

мастодонт бусты с выбранного сервера IDG

Здесь мы смотрим на последние 50 повышений (версия ретвита Mastodon) в моей домашней линии. Это запрос, чтобы найти их.

select
  *
from
  mastodon_toot
where
  timeline="home"
  and reblog_server is not null
  limit  50

Если мы сосредоточимся на Брайане Марике, мы увидим, что:

  • Брайан принадлежит к mastdn.social.
  • Брайан продвинул пост Тима Брея.
  • Тим принадлежит hachyderm.io.

Итак, на этом графике показано, как люди на выбранном сервере усиливают людей на других серверах. В данном случае выбран сервер mastdn.social, но мы можем переориентировать график на любой другой сервер, отправляющий повышения.

Второй график уменьшен, чтобы показать сеть взаимосвязей повышения между серверами. Если кто-то на infosec.exchange повышает кого-то на mastodon.world, есть ребро, соединяющее два узла. Хотя на этом графике этого нигде не происходит, стрелка может указывать в обе стороны и была бы, если бы кто-то на mastodon.world также повышал кого-то на infosec.exchange.

мастодонт прокачивает сервер за сервером IDG

Давайте построим первый график шаг за шагом.

Шаг 1. Определите выбранный сервер

Вот определение узла, представляющего выбранный сервер.

node {
  category = category.selected_server
  args = [ self.input.server.value ]
  sql = <<EOQ
    select
      server as id,
      server as title,
      jsonb_build_object(
        'server', server
      ) as properties
    from
      mastodon_boosts()
    where
      server = $1
  EOQ
}

Согласно документации, запрос узла должен как минимум выбрать столбец с псевдонимом id. Вот это server столбец в строке, возвращенной вышеуказанным запросом. Я упаковал этот запрос в функцию SQL, mastodon_boostsчтобы скрыть детали (timeline="home" reblog_server is not null limit 50) и упростить фокусировку на том, что особенного в каждом узле. В этом случае особое качество заключается в том, что столбец сервера, который дает узлу его идентификатор, соответствует выбранному серверу.

Если блок графа включает только этот узел, а выбранный сервер — mastdn.social, вот рендеринг. Здесь пока не на что смотреть!

релграф шаг 1 IDG

Узел определяет набор свойств, которые могут быть любыми столбцами, возвращаемыми базовым запросом; они появляются при наведении курсора на узел. Узел также относится к категории, которая управляет значком, цветом и ссылкой узла. Вот категория для выбранного сервера.

category "selected_server" {
  color = "darkgreen"
  icon = "server"
  href  = "https://{{.properties.'server'}}"
}

Шаг 2. Определите усиленные серверы

Теперь мы добавим усиленные серверы. Этот узел использует тот же набор записей: 50 последних повышений в моей ленте. Опять находит только тех, чьи server столбец соответствует выбранному серверу. Но id теперь reblog_server который является целью, а не источником бустов с выбранного сервера.

node {
  category = category.boosted_server
  args = [ self.input.server.value ]
  sql = <<EOQ
    select
      reblog_server as id,
      reblog_server as title
    from
      mastodon_boosts()
    where
      server = $1
    EOQ
}

Вот график с обоими selected_server и boosted_server узлы. Мы использовали другую категорию, чтобы различать усиленные узлы.

релграф шаг 2 IDG

Выбран только один сервер, но он может отправлять усиления более чем на один усиленный сервер. Рендеринг по умолчанию сворачивает их в один узел, но вы можете щелкнуть, чтобы развернуть и увидеть их все.

Шаг 3. Определите людей, которые поддерживают других

Где люди? Давайте добавим их дальше, начиная с людей, которые отправляют повышения.

node {
  category = category.person
  args = [ self.input.server.value ]
  sql = <<EOQ
    select
      username as id,
      display_name as title,
	    jsonb_build_object(
        'instance_qualified_account_url', instance_qualified_account_url
      ) as properties
    from
      mastodon_boosts()
    where
     server = $1
    EOQ
  }
релграф шаг 3 IDG

имя пользователя столбец дает узлу его идентификатор. Обратите внимание также на свойство instance_qualified_account_url. Это синтетический столбец, который мы добавили в плагин Mastodon в прошлый раз, чтобы гарантировать правильную работу ссылок на людей и инструменты в клиенте Mastodon. Потому что это включено в свойство здесь, и потому что category.person относится к этому свойству, ссылки, представляющие людей в графе, будут разрешены правильно.

Шаг 4. Определите людей, которых повысили

Этот узел берет свое имя из reblog_username столбец и использует синтетический столбец instance_qualified_reblog_url предоставить ссылку.

node {
  category = category.boosted_person
  args = [ self.input.server.value ]
  sql = <<EOQ
    select
      reblog_username as id,
      reblog_username as title,
      jsonb_build_object(
        'instance_qualified_reblog_url', instance_qualified_reblog_url
      ) as properties
    from
      mastodon_boosts()
    where
      server = $1
  EOQ
}
Релграф шаг 4 IDG

Шаг 5: Подключите бустеры на выбранном сервере к этому серверу.

До сих пор мы видели только узлы, чьи запросы минимально возвращают id свойство. Ребро соединяет узлы с помощью запроса, который минимально возвращает столбцы с псевдонимом from_id и to_id.

edge {
  sql = <<EOQ
    select
      username as from_id,
      server as to_id,
      'belongs to' as title
    from
      mastodon_boosts()
  EOQ
}

Вы также захотите указать заголовок для маркировки края. Здесь это ребро встречается дважды, обозначая «Джон Маши принадлежит к mstdn.social» и «Брайан Марик принадлежит к mstdn.social».

релграф шаг 5 IDG

Шаг 6. Подключите людей на усиленных серверах к своим серверам.

Этот край работает так же, но фиксирует отношения между повышенными людьми и их серверами.

edge {
  args = [ self.input.server.value ]
  sql = <<EOQ
    select
      reblog_username as from_id,
      reblog_server as to_id,
      'belongs to' as title
    from
      mastodon_boosts()
    where
      server = $1
  EOQ
}

релграф шаг 6 IDG

Шаг 7: Подключите бустеры к людям, которых они повышают

Наконец, мы добавляем преимущество, чтобы связать бустеров с людьми, которых они усиливают.

edge {
  category = category.boost
  args = [ self.input.server.value ]
  sql = <<EOQ
    select
      username as from_id,
      reblog_username as to_id,
      'boosts' as title,
      jsonb_build_object(
        'reblog_username', reblog_username,
        'reblog_server', reblog_server,
        'content', reblog ->> 'content'
      ) as properties
    from
      mastodon_boosts()
    where
      server = $1
  EOQ
}

И вот мы завершили первый график, показанный выше.

релграф шаг 7 IDG

График отношений GitHub

Вы можете использовать эту грамматику узлов и ребер для описания отношений в любой области. Вот график, который просматривает все репозитории, связанные со Steampipe, и показывает недавно обновленные PR от внешних участников.

relgraph github внешний prs IDG

А вот тот, который использует любой плагин Steampipe для отображения недавно обновленных запросов на вытягивание для выбранного репо.

обновления relgraph github mod pr IDG

Эти два представления используют общий SQL-запрос и служат дополнительным целям. Таблица удобна для сортировки по дате или автору, на графике выделены связи «один ко многим».

Снятие бремени сборки контекста

В статье «Как правильно сделать TimeDance» я оплакивал уход из жизни инструмента для планирования встреч, который отлично подходил для объединения сообщений и документов, связанных с собранием. Я назвал это «сборкой контекста» — термин, который я позаимствовал у Джека Оззи, соучредителя Groove, еще одного инструмента для совместной работы, уход которого я оплакиваю. Сборка контекста — тяжелая работа. Слишком часто бремя ложится на людей, которым нужно только использовать этот контекст и которые не хотят тратить время и усилия на его создание.

Мы видели, как SQL может унифицировать доступ к API. Теперь это также может помочь нам увидеть отношения между данными, которые мы извлекаем из этих API.

Эта серия:

  1. Автономность, размер пакета, трение, разветвление и скорость
  2. Mastodon, Steampipe и RSS
  3. Просмотр федиверса
  4. Терминал Bloomberg для Mastodon
  5. Создайте свой собственный Mastodon UX
  6. Списки и люди на Mastodon
  7. Сколько людей в моей ленте Mastodon также написали сегодня в Твиттере?
  8. URL-адреса Mastodon с указанием экземпляра
  9. Графики взаимоотношений мастодонтов
  10. Работа со списками мастодонтов
  11. Изображения считаются вредными (иногда)
  12. Картирование более широкой федеральной сети
  13. Протоколы, API и соглашения
  14. Новости в федерации
  15. Сопоставление людей и тегов в Mastodon
  16. Визуализация модерации сервера Mastodon
  17. Сроки Mastodon для команд
  18. Плагин Mastodon теперь доступен на Steampipe Hub.

Related Posts

Оставить комментарий