Herkese selam, 2-3 hafta hafta kadar önce Apache SkyWalking’e bakmam gerekti. Apache vakfının gayet güzel ürünlerinden bir tanesiyle daha tanışmış oldum.
Dokümanını ve GitHub reposunu görünce güzel bir başlangıç olacağını düşündüm ama PHP ile uyumlu bir Docker image hazırlamak bir hayli eziyetli oldu.
İlk aşamada PECL olmadan kaynak kodunu derleyip oluşan .so dosyasını almak istedim ama birçok kez hata aldım. Bu süreç içinde neredeyse her gün derlemeler için ortalama 5-6 saat harcadım. Bazı günler mesai saatlerinde şirket bilgisayarında çalışırken benim bilgisayarda build almaya devam ediyordum. Tüm günü harcadığı da oldu. Her ne kadar Docker kendi içinde cache kullanıyor olsa da dosyaların derlenme işlemi öyle hemen bitmiyor. En küçük hatada yeniden başladıkça süre sürekli uzuyor. Süreci en çok etkileyenlerden biri internet hızı. Tek başıma 35 Mbit kullanmama rağmen abartısız 100’den fazla kez sadece internet bağlantı hatasından dolayı yarım kaldı.
Rust ! Dışardan bakınca güzel görünen ama bu derlemeler sırasında Cargo adlı paket yöneticisini tanıyınca yazmadığıma şükrettiğim belalı dil! Cargo’nun geliştiricisine de geliştirilmesinde emeği geçenlere de bugüne kadar bu lanet şeyi yok etmek için savaş açmamış yazılımcılara da diyecek bir şey bulamıyorum. Bu lanet şey en ufak derleme işlemi için bile tüm interneti indirmeye çalışıyor ve sürekli bağlantıyı koparıyor. Varsayılan olarak kaldığı yerden devam etme özelliği de yok. 10 mb’lık Docker image oluşturacak olursanız bile gigabyte’larca veri indiriyor. Daha doğrusu indirmeyi bile beceremiyor. Bu lanet şeyin işi bir türlü bitmediği için bir süre sonra bağlantı hatası verip kapanıyor. Bu yarım kalmaları engellemek için Git ile ilgili Dockerfile içine bazı eklemeler yapmak zorunda kaldım.
Kaynak koddan yaptığım defalarca denemeden sonra 1-2 kez başarılı build alabildim. İşin kötü tarafı tüm sürecin üstünden bir daha geçeyim dediğinizde Dockerfile üzerinde hiçbir değişiklik olmamasına rağmen tekrar build alınamıyor. Özetle bozuk araba gibi gittiği yere kadar ilerletip hata verdikten sonra tekrar arkadan ittirip devam ediyorsunuz. Böyle böyle bir önceki denemezinde oluşan cache okunarak son adıma kadar ilerliyor ve şansınız varsa build tamamlanıyor. Çoğunlukla o da olmuyor. Sonra diyorsunuz ki cache temizliği yapayım, şunu tek seferde bir daha çalıştırayım ama yine çalışmıyor. Özetle içimden geçenleri anlamış olmalısınız. Şeyini Şey Yaptığımın Şeyi bir türlü sonuçlanmıyor özetle. Resmen canı sıkıldıkça build hatası veriyor, küfür etmemiz için elinden geleni yapıyor. Cargo’nun yayınında ve yapımında emeği geçen herkesi yazılım dünyasının emektar çalışanları adına saygıyla anmaktan başka elinizden bir şey gelmiyor.
Bunca sözün ardından çalışma ortamıma laf edeceklere şimdiden cevabı vereyim. Sorun ne internet hızımda ne de bilgisayarımın zayıflığında. MacBook 16 GB M1 Pro cihazda bu işlem böyle sürüyorsa diğer cihazlarda ne kadar süreceğini siz tahmin edin artık.
Sonunda sıkılıp PECL ile devam etmeye karar verdim. Bu kez ortalama 20 dk içinde her şey tamamlandı. Gerekli düzenlemeleri de yaptıktan sonra 10 dk içinde build alınabilir hale geldi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# 1. Adım : Build işlemleri için base image oluşturuluyor FROM --platform=linux/amd64 php:8.3.3-fpm AS build_apache_skywalking WORKDIR /var/www/ RUN rm -rf /var/www/* ENV GIT_TRACE_PACKET=1 ENV GIT_TRACE=1 ENV GIT_CURL_VERBOSE=1 ENV BUILD_FOLDER_NAME=___build RUN mkdir $BUILD_FOLDER_NAME WORKDIR /var/www/$BUILD_FOLDER_NAME RUN true \ ########## Apache SkyWalking # https://skywalking.apache.org/docs/skywalking-php/next/en/setup/service-agent/php-agent/readme/ # 1. Build edilebilmesi için "cargo" yüklü olmalı && export CARGO_NET_GIT_FETCH_WITH_CLI=true \ && apt-get update -y \ && apt-get install -y git gnutls-bin wget \ && curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs -o rust.sh \ && chmod +x rust.sh \ && sh ./rust.sh -y \ && export PATH="$HOME/.cargo/bin:$PATH" \ && touch $HOME/.cargo/config.toml \ && echo '[net]\nretry = 3\ngit-fetch-with-cli = true' > $HOME/.cargo/config.toml \ # 2. SkyWalking && apt install -y gcc make llvm-13-dev libclang-13-dev protobuf-c-compiler protobuf-compiler \ && pecl install --configureoptions 'enable-cargo-debug="no" enable-kafka-reporter="yes"' skywalking_agent \ # 3. Oluşturulan dosyalar dışarı alınıyor && CURRENT_BUILD=$(ls -td -- /usr/local/lib/php/extensions/* | head -n 1) \ && cp $CURRENT_BUILD/skywalking_agent.so /var/www \ # 4. Yüklenen paketler siliniyor && rustup self uninstall -y \ && (apt-get remove -y --auto-remove rust cargo | true) \ && (apt-get purge -y cargo | true) \ && (apt remove -y llvm-13-dev libclang-13-dev | true) \ && rm -rf ~/.cargo \ ########## Genel Temizlik Yapılıyor.. && apt-get autoclean && apt-get clean \ && apt-get clean autoclean && apt-get -y autoremove && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* \ && cd /var/www \ && rm -rf $BUILD_FOLDER_NAME WORKDIR /var/www # 2. Adım : PHP 8.3 için image oluşturuluyor FROM --platform=linux/amd64 php:8.3.3-fpm MAINTAINER Sakir Mehmetoglu <sakir.mehmetoglu@gmail.com> ARG SKYWALKING_SERVICE_NAME="hello-skywalking" ARG SKYWALKING_SERVICE_ADDR="127.0.0.1:11800" ARG SKYWALKING_SERVICE_ON_OR_OFF="On" ENV ENV_SKYWALKING_SERVICE_NAME=$SKYWALKING_SERVICE_NAME ENV ENV_SKYWALKING_SERVICE_ADDR=$SKYWALKING_SERVICE_ADDR ENV ENV_SKYWALKING_SERVICE_ON_OR_OFF=$SKYWALKING_SERVICE_ON_OR_OFF WORKDIR /var/www RUN rm -rf /var/www/* # Tüm kurulum işlemleri yapılıyor RUN true \ # Güncelleme Yapılıyor.. && apt-get update -y \ \ # Gerekli Yazılımlar Kuruluyor.. && apt-get install -y \ # cgi-fcgi - FASTCgi (fcgi) is a language independent, high performant extension to CGI libfcgi0ldbl \ \ # Temizlik Yapılıyor.. && apt-get clean autoclean && apt-get -y autoremove && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* COPY --from=build_apache_skywalking /var/www/skywalking_agent.so . RUN true \ # Build işlemi sonrasında alından *.so dosyalarını olması gereken doğru klasöre taşıyor && CURRENT_BUILD=$(ls -td -- /usr/local/lib/php/extensions/* | head -n 1) && mv skywalking_agent.so $CURRENT_BUILD \ # .ini dosyası oluşturuluyor && echo '[skywalking_agent]' > /usr/local/etc/php/conf.d/skywalking_agent.ini \ && echo "extension = $CURRENT_BUILD/skywalking_agent.so" >> /usr/local/etc/php/conf.d/skywalking_agent.ini \ && echo "skywalking_agent.enable = $ENV_SKYWALKING_SERVICE_ON_OR_OFF" >> /usr/local/etc/php/conf.d/skywalking_agent.ini \ && echo 'skywalking_agent.log_file = /tmp/skywalking-agent.log' >> /usr/local/etc/php/conf.d/skywalking_agent.ini \ && echo 'skywalking_agent.log_level = INFO' >> /usr/local/etc/php/conf.d/skywalking_agent.ini \ && echo "skywalking_agent.server_addr = $ENV_SKYWALKING_SERVICE_ADDR" >> /usr/local/etc/php/conf.d/skywalking_agent.ini \ && echo "skywalking_agent.service_name = $ENV_SKYWALKING_SERVICE_NAME" >> /usr/local/etc/php/conf.d/skywalking_agent.ini RUN echo '<?php\n\nphpinfo();' > index.php |
Bu son halini aşağıdaki komut ile build edebilirsiniz.
1 |
docker build -t php-fpm-83-apache-skywalking . |
Ardından aşağıdaki komutları test.sh
adında dosya oluşturarak içine ekleyin ve çalıştırın.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/bin/sh set -e process_id=$(docker run --platform linux/amd64 -d php-fpm-83-apache-skywalking) CMD="sleep 0.5 && SCRIPT_FILENAME=/var/www/index.php REQUEST_METHOD=GET cgi-fcgi -bind -connect localhost:9000" html_content=$(docker exec -t $process_id sh -c "$CMD") search_text='<tr><td class="e">skywalking_agent.enable</td><td class="v">1</td><td class="v">1</td></tr>' match=$(echo "$html_content" | grep -qF "$search_text" && echo "Apache SkyWalking Enabled !" || echo "Apache SkyWalking Disabled Or Not Found !") echo "$match" docker stop $process_id > /dev/null 2>&1 docker rm $process_id > /dev/null 2>&1 |
Terminalde sh dosyasını aşağıdaki gibi çalıştırın.
1 |
sh ./test.sh |
Çıktı olarak aşağıdaki gibi olumlu veya olumsuz sonuç göreceksiniz.
1 2 |
➜ home sh ./test.sh Apache SkyWalking Enabled ! |
1 2 |
➜ home sh ./test.sh Apache SkyWalking Disabled Or Not Found ! |
Tarayıcıda görüntülemek istiyorsanız NGINX, Apache veya başka bir yazılım kullanarak PHP-FPM için host oluşturmanız gerekiyor. Container çalıştığı zaman anasayfada phpinfo()
çıktısını göreceksiniz.
Faydalı olması dileğiyle..
Bir sonraki yazıda görüşmek üzere.
İlk Yorumu Siz Yapın