storage.io
• Распределённое отказоустойчивое хранилище
• S3-совместимое API
• Близко к российскому пользователю
• Elliptics, nginx
• Chef, Zabbix, Fabric
• Go
Slide 6
Slide 6 text
О чём речь?
• cgo: вызов C из Go и Go из C
• mruby: вызов Ruby из Go и Go из Ruby
• Тестирование
• Управление зависимостями: go get or not go get
• Деплоймент
• Мониторинг и метрики
Slide 7
Slide 7 text
cgo
• Вызов C из Go и Go из C
• Простые типы, указатели
• struct, enum, union
• errno: n, err := C.sqrt(-1) // EDOM
• Динамическая и статическая (с 1.1)
линковка
Проблемы cgo
• runtime: cgo callback on thread not
created by Go – очередь с
pthread_mutex_t / pthread_cond_t,
или Go 1.1
• C.f2(C.f1) – must call C.f1
Slide 11
Slide 11 text
mruby
• mini Ruby (как Lua, но лучше)
• Анализ и изменение поведения
программы на лету
Slide 12
Slide 12 text
Проблемы mruby
• Нет релиза mruby
• Только статическая библиотека
mruby, только динамическая
линковка в cgo в Go 1.0
• ld: Assertion failed:
(reExportDylibCount != 0)
Slide 13
Slide 13 text
github.com/AlekSi/gomruby
• Жду Go 1.1: статическая линковка в
cgo, больше возможностей в reflect
Slide 14
Slide 14 text
Модульные тесты
func TestSqrt(t *testing.T) {
! const in, out = 4, 2
! if x := Sqrt(in); x != out {
! ! t.Errorf("Sqrt(%v) = %v, want %v",
in, x, out)
! }
}
• Benchmarks, example
• launchpad.net/gocheck
Slide 15
Slide 15 text
No content
Slide 16
Slide 16 text
«Unit tests are waste.»
- James O. "Jim" Coplien
Slide 17
Slide 17 text
Системные тесты
• Тестирование веб-приложения
через API
• Минимальный setup / teardown
• Как настоящий пользователь API
Slide 18
Slide 18 text
Следствия
• Простые системные тесты можно
использовать для нагрузочного
тестирования
• Запросы и ответы могут быть
использованы для
документирования API
Slide 19
Slide 19 text
No content
Slide 20
Slide 20 text
Системные тесты + Go
• net на goroutines
• HTTP/1.1, keep-alive, gzip, chunked
encoding, timeouts
Slide 21
Slide 21 text
github.com/AlekSi/gophers
• Пока что приватный :(
• Но вы можете помочь! :)
Slide 22
Slide 22 text
go get
•Только одна версия
– последняя
•Стабильность API
•Удаление кода
•go get
launchpad.net/
gocheck
•Супер просто
Slide 23
Slide 23 text
github.com/AlekSi/nut
• zip-архив
• Версионирование (SemVer)
• Зависимости
Slide 24
Slide 24 text
gonuts.io
• PyPI, RubyGems.org, NPM, Composer
• Установка зависимостей
• nut удалить нельзя
Slide 25
Slide 25 text
Реакция сообщества
• It has been shown so many times why
the versioning idea is broken.
• Mate, I'm not going to quote urban
dictionary to you, but you have to find
another name for a versioned
package. Nut is not acceptable.
(сообщение в группу golang-nuts)
Slide 26
Slide 26 text
Реакция сообщества
• It's annoying to me how few people
seem to think that dependency
management isn't a huge missing piece
in the Go tooling.
• Would you prefer gonads.io?
Slide 27
Slide 27 text
Что дальше?
• Фиксация зависимостей
приложения (bundle lock)
• Извлечение конкретной ревизии
после go get
Zabbix
• Комплексное решение
• Странный API
• порядок полей в json важен для zabbix-
server
• формат чисел важен (%.6f)
• не всегда соответствует документации
Slide 30
Slide 30 text
Zabbix
• Хост создаётся до нас
• Создаём приложение при запуске
• Создаём items динамически
• Графики, экраны и триггеры создаются
руками и копируются на другие хосты