Рубрики
Без рубрики

Использование Django с Elasticsearch, Logstash и Kibana (ELK Stack)

Использование Django с Elasticsearch, Logstash и Kibana

Автор оригинала: Samuel James.

Для некоторых разработчиков концепция поиска всегда заключалась в использовании обычных баз данных, таких как PostgreSQL, MongoDB, SQLite и т. Д., И выполнении запросов к ним. Хотя это хорошо, есть ситуации, когда поиск должен быть на очень большом наборе данных, и оптимизация становится необходимостью.

болтовня

Elasticsearch in summary-это хранилище данных/поисковая система, которая может быть использована для индексации данных из любой обычной базы данных для быстрого поиска.

С таким большим количеством событий в вашем приложении, и вам нужен способ получить всю эту информацию, зарегистрированную в центральном месте. Think Logstash – инструмент для сбора , обработки и пересылки событий и сообщений журнала.

Когда все будет сказано и сделано, не предпочтете ли вы способ визуализировать все эти данные и события? Да! введите Кибана .

Итак, чего мы хотим достичь здесь?

  • Настройте стек ELK и убедитесь, что он работает правильно
  • Потяните вниз дополнительные зависимости/библиотеки
  • Соедините точки с существующим проектом Django
    • Отправка журналов Django в Logstash
    • Индексирование существующей базы данных в elasticsearch
    • Индексация каждого нового экземпляра, сохраненного пользователем в базе данных
    • Визуализация с помощью kibana
  • Базовый пример поиска

Вот ссылка на пример настройки, чтобы вы могли легко увидеть, что происходит. Ну что, начнем?

ИСХОДНЫЙ КОД

УСТАНОВКА ЛОСЯ

Для Ubuntu

  • Установите ElasticSearch: https://www.elastic.co/guide/en/elasticsearch/reference/current/_installation.html
  • Установите Kibana: https://www.elastic.co/guide/en/kibana/current/setup.html
  • Установите Logstash: https://www.elastic.co/guide/en/logstash/current/installing-logstash.html

Для Mac С использованием homebrew

  • Install ElasticSearch: brew install elasticsearch
  • Install Logstash: brew install logstash
  • Install Kibana: brew install kibana

После настройки стека ELK, чтобы убедиться, что он работает правильно, перейдите к default localhost:5601 и localhost:9200 для kibana и elasticsearch соответственно, чтобы увидеть, что он работает.

Примечание: Каждый процесс необходимо запускать из командной строки.

Примечание: Каждый процесс необходимо запускать из командной строки.
Примечание: Каждый процесс необходимо запускать из командной строки.
Примечание: Каждый процесс необходимо запускать из командной строки.

Потяните вниз дополнительные зависимости/библиотеки

Для Django мы будем использовать Python-logstash via pip install python-logstash обработчик ведения журнала python для logstash. Это позволит нам отправлять все наши журналы в logstash. Мы также будем использовать модуль django-elasticsearch-dsl , который позволит нам взаимодействовать с elasticsearch для этого урока.

pip install django-elasticsearch-dsl

# Elasticsearch 5.x
pip install 'elasticsearch-dsl>=5.0,<6.0'

# Elasticsearch 2.x
pip install 'elasticsearch-dsl>=2.0,<3.0'

Соедините точки с существующим проектом Django

  • Добавьте следующее в настройки Django:
# settings.py 

INSTALLED_APPS = [
  # .... 
    'django_elasticsearch_dsl',
]

ELASTICSEARCH_DSL={
    'default': {
        'hosts': 'localhost:9200'
    },
}

LOGGING = {
  'version': 1,
  'disable_existing_loggers': False,
  'formatters': {
      'simple': {
            'format': 'velname)s %(message)s'
        },
  },
  'handlers': {
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'logstash': {
            'level': 'WARNING',
            'class': 'logstash.TCPLogstashHandler',
            'host': 'localhost',
            'port': 5959, # Default value: 5959
            'version': 1, # Version of logstash event schema. Default value: 0 (for backward compatibility of the library)
            'message_type': 'django',  # 'type' field in logstash message. Default value: 'logstash'.
            'fqdn': False, # Fully qualified domain name. Default value: false.
            'tags': ['django.request'], # list of tags. Default: None.
        },
  },
  'loggers': {
        'django.request': {
            'handlers': ['logstash'],
            'level': 'WARNING',
            'propagate': True,
        },
        'django': {
            'handlers': ['console'],
            'propagate': True,
        },
    }
}

Чтобы узнать больше о входе в Django, проверьте/прочитайте документы здесь

Теперь, когда мы настроили ведение журнала для нашего проекта Django, нам нужно сообщить logstash, откуда он должен получать входные данные и как он должен отправлять эту информацию в elasticsearch. Для этого нам нужно создать файл logstash.conf с инструкцией для logstash.

input {
    tcp {
    port => 5959
    codec => json
  }
}
output {
  elasticsearch {
    hosts => ["localhost:9200"]
  }
}

Примечание: Убедитесь, что порт logstash (59) и хосты elasticsearch (localhost:9200) совпадают с вашими settings.py

  • Теперь запустите logstash, используя ./logstash -f path/to/logstash.conf
  • Откройте kibana dashboard localhost:5601 и создайте индекс с помощью django или вручную через консоль разработчика на панели Kibana logstash-* мы будем использовать Django для этого урока. Чтобы узнать, как использовать консоль или взаимодействовать с elasticsearch через REST API, я рекомендую это краткое видео на youtube или это сообщение в блоге
  • Запустите Django server и просмотрите страницу, которая вызывает какую-либо ошибку, или используйте журналы Django, чтобы увидеть что-то, отображаемое на вашей панели мониторинга kibana
# import the logging library
import logging

# Get an instance of a logger
logger = logging.getLogger(__name__)

def my_view(request, arg1, arg):
    ...
    if bad_mojo:
        # Log an error message
        logger.error('Something went wrong!')
Запустите Django server и просмотрите страницу, которая вызывает какую-либо ошибку, или используйте журналы Django, чтобы увидеть что-то, отображаемое на вашей панели мониторинга kibana

Теперь давайте свяжем ElasticSearch с Django вот наш пример models.py Модель книги, которую мы намерены индексировать с помощью эластичного поиска.

class Book(TimeStamp):
    """Book model defined here"""
    title = models.CharField(max_length=100)
    isbn = models.CharField(max_length=100)
    category = models.CharField(max_length=100)

    def __unicode__(self):
        return "Book Title: {}" .format(self.title)

Первое, что вам нужно сделать здесь, – это создать соединение из вашего приложения Django с ElasticSearch.

создать documents.py file и добавьте это в файл, именно здесь будет жить код Elasticsearch.

# documents.py

from elasticsearch_dsl.connections import connections
# Create a connection to ElasticSearch
connections.create_connection()

После этого нам нужно иметь определение того, что вы хотите индексировать в нем.

# documents.py

from django_elasticsearch_dsl import DocType, Index
from .models import Book

book = Index('books') 

# reference elasticsearch doc for default settings here
book.settings(
    number_of_shards=1,
    number_of_replicas=0
)

@book.doc_type
class BookDocument(DocType):

    class Meta:
        model = Book
        fields = ['title', 'isbn', 'category']

сохраните и запустите эту команду на консоли, чтобы создать индекс для вашего приложения python manage.py search_index --rebuild это создаст индекс для существующей модели. Кроме того, всякий раз, когда новый экземпляр модели сохраняется, он автоматически индексируется в elasticsearch, обратитесь к модулю django для получения дополнительного контекста.

Теперь давайте посмотрим на это через Kibana Когда вы открываете localhost:5601 и переходите по вкладкам Discover , просто выберите имя вашего индекса, и вы увидите, что было проиндексировано из вашей базы данных, вы также можете выполнить пользовательский seach здесь, если хотите…

Теперь давайте посмотрим на это через Kibana || Когда вы открываете || localhost:5601 || и переходите по вкладкам || Discover||, просто выберите имя вашего индекса, и вы увидите, что было проиндексировано из вашей базы данных, вы также можете выполнить пользовательский seach здесь, если хотите...

Базовый пример поиска

Чтобы создать простой поиск, найдите все книги по названию

добавьте этот фрагмент в documents.py

# documents.py 

from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
client = Elasticsearch()
my_search = Search(using=client)

# define simple search here
# Simple search function
def search(title):
    query = my_search.query("match", title=title)
    response = query.execute()
    return response

Давайте попробуем функцию поиска. В оболочке python manage.py оболочка

Python 2.7.13 (default, Dec 18 2016, 07:03:39)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from bookmeapi.documents import *
>>> print(search("Helper"))
]>
>>>

Вот полный код для documents.py

from elasticsearch_dsl.connections import connections
from django_elasticsearch_dsl import DocType, Index
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search

client = Elasticsearch()

my_search = Search(using=client)

from .models import Book

# Create a connection to ElasticSearch
connections.create_connection()

book = Index('books')

book.settings(
    number_of_shards=1,
    number_of_replicas=0
)


@book.doc_type
class BookDocument(DocType):

    class Meta:
        model = Book
        fields = ['title', 'isbn', 'category']


# define simple search here
# Simple search function
def search(title):
    query = my_search.query("match", title=title)
    response = query.execute()
    return response

Вывод

Мы, безусловно, прошли долгий путь-от настройки стека ELK до подключения к существующему приложению Django и реализации простого поиска. Куда нам теперь идти? Я бы предложил дополнительно ознакомиться с веб-сайтом ElasticSearch и посмотреть на безопасность с помощью стека ELK при переходе от разработки к производству.

Спасибо за чтение и не стесняйтесь, чтобы вам понравился этот пост.