Size: a a a

Saint P Ruby Community

2020 April 07

v

vizvamitra in Saint P Ruby Community
Andrey Novikov
Вообще не должен. Только если кто-то где-то явно присвоил nil, как значение ключу во внутреннем хэше. 🤔
хорошая мысль. Проверил, но нет, этого не происходит
источник

VD

Vla Dem in Saint P Ruby Community
vizvamitra
хорошая мысль. Проверил, но нет, этого не происходит
Может кто-то переопределяет стор на просто хэш без default_proc?
источник

v

vizvamitra in Saint P Ruby Community
Vla Dem
Может кто-то переопределяет стор на просто хэш без default_proc?
у меня чувство такое, будто это я где-то какую-то описку допустил и не замечаю. Код, который я показывал, — это код из гема prometheus-client. У меня написана небольшая обвязка, определяющяя необходимый набор лейблов и прячущая в себя работу с самим гемом.

По идее, все сторы создаются ещё когда ты регистрируешь набор метрик в initializer-е, а потом ты уже только меняешь данные в них. Код, который посылает метрику, с которой у меня проблема, используется в нескольких местах, но ошибка лезет только в одном из них. Единственная разница между этими местами, что мне приходит на ум, — в том, что они срабатывают в разных процессах (у нас delayed jobs и очереди поделены между несколькими воркерами, каждый из которых в своём процессе)
источник

v

vizvamitra in Saint P Ruby Community
мистика
источник

VD

Vla Dem in Saint P Ruby Community
vizvamitra
у меня чувство такое, будто это я где-то какую-то описку допустил и не замечаю. Код, который я показывал, — это код из гема prometheus-client. У меня написана небольшая обвязка, определяющяя необходимый набор лейблов и прячущая в себя работу с самим гемом.

По идее, все сторы создаются ещё когда ты регистрируешь набор метрик в initializer-е, а потом ты уже только меняешь данные в них. Код, который посылает метрику, с которой у меня проблема, используется в нескольких местах, но ошибка лезет только в одном из них. Единственная разница между этими местами, что мне приходит на ум, — в том, что они срабатывают в разных процессах (у нас delayed jobs и очереди поделены между несколькими воркерами, каждый из которых в своём процессе)
Во, процессы. То есть инициализируются в одном процессе, а вызываться может в другом?
источник

M

Mikhail in Saint P Ruby Community
vizvamitra
Вопрос к знатокам асинхронности. Как код на скриншоте может выдавать

NoMethodError: undefined method '+' for nil:NilClass

при вызове

obj.increment(labels: {}, by: 1)

? (руби старый, 2.1.2)
А разве Hash thread-safe? На сколько я понимаю, GIL блокирует одновременную работу более одного потока в Ruby коде, но аллокация НОВОЙ памяти - это вызов сишных функций. В этом коде может быть ситуация, когда первый поток создал key но не создал еще value. В момент создания value идет обращение к системе за новой памятью, а в руби коде идет переключение на другой поток в этот момент, который может попробвать обратится к тому же key. Но, по скольку value еще не был создан, то получится описанная выше ошибка. Чтобы избежать этого, стоит использовать Concurrent::hash какой нибудь
источник

NS

Nikita Shilnikov in Saint P Ruby Community
там весь код за локом
источник

AD

Anton Davydov in Saint P Ruby Community
Nikita Shilnikov
там весь код за локом
не весь, конструктор вне лока
источник

NS

Nikita Shilnikov in Saint P Ruby Community
какая разница, у тебя конструктор же не вызывается два раза
источник

AD

Anton Davydov in Saint P Ruby Community
вот кстати интересно, реально ли его вызвать два раза как-то
источник

NS

Nikita Shilnikov in Saint P Ruby Community
ну вызвать-то можно, но сам руби это не делает
источник

SK

Sergey Kojin in Saint P Ruby Community
vizvamitra
Вопрос к знатокам асинхронности. Как код на скриншоте может выдавать

NoMethodError: undefined method '+' for nil:NilClass

при вызове

obj.increment(labels: {}, by: 1)

? (руби старый, 2.1.2)
ну ты выложи рабочий код на gist
источник

AN

Andrey Novikov in Saint P Ruby Community
Vla Dem
Во, процессы. То есть инициализируются в одном процессе, а вызываться может в другом?
Не, не может. Прометей в каждом процессе метрики отдельно собирает (с этим связана отдельная боль, как собирать и агрегировать метрики со всех воркеров пумы или юникорна)
источник

S

Svetlana in Saint P Ruby Community
Всем привет! Дарим разработчикам 10 000 рублей, чтобы как-то сгладить неудобства этого времени и поддержать разработчиков в тяжелое время, сервис headz.io запускает акцию. Если вы потеряли работу или заказы на фрилансе, регистрируйтесь на headz.io. Всем, кто найдет работу в апреле через платформу, мы выплатим бонусные 10 000 рублей. Акция действует как на новых пользователей, так и на тех, кто уже давно зарегистрировался.


https://habr.com/ru/post/496028/
источник
2020 April 08

w

wi11son in Saint P Ruby Community
гайз, тупой вопрос:
у меня есть
today = {user1: 1, user2: 2}
last_week = {user1: 5, user2: 10}
...


как мне из этого сделать
{user1: { today: 1, last_week: 5}, user2: {today: 2, last_week: 10}}
?
источник

w

wi11son in Saint P Ruby Community
даже достаточно будет
{user1:  [1, 5], user2: [2, 10]}
источник

f🤔

focusshifter 🤔 in Saint P Ruby Community
wi11son
даже достаточно будет
{user1:  [1, 5], user2: [2, 10]}
today.merge(last_week) { |k, v1, v2| [v1, v2] } ?
источник

f🤔

focusshifter 🤔 in Saint P Ruby Community
а до этого отконвертить today в { user1: { today: 1 } }
источник

PP

Pavel Peganov in Saint P Ruby Community
wi11son
даже достаточно будет
{user1:  [1, 5], user2: [2, 10]}
Ну можно сделать гадко, императивно и бесхитростно, как удар бревном:
today.each_key.with_object({}) { |k, h| h[k] = [today[k], last_week[k]] }
источник

AD

Anton Davydov in Saint P Ruby Community
Pavel Peganov
Ну можно сделать гадко, императивно и бесхитростно, как удар бревном:
today.each_key.with_object({}) { |k, h| h[k] = [today[k], last_week[k]] }
я бы так и сделал на самом деле, а потом уже думал как красиво сделать. но наверно я бы через each делал и переменную
источник